推导式
推导式中的if语句,下面的代码不科学,如果条语是 and or 的话,不要写两个 if
ls = [x for x in range(100) if x % 2 == 0 if x % 5 == 0] # 不建议写两个if,不易读,把if换成and print(ls) ls = [x for x in range(100) if x % 2 == 0 and x % 5 == 0] print(ls) ls = [x for x in range(100) if x % 2 == 0 or x % 5 == 0] print(ls)
说明:str tuple不可以用推导式,因为其值不可以改变
使用小括号包裹推导式会生成生成器对象,而不是元组。
a = (x for x in range(3)) print(a) # <generator object <genexpr> at 0x0000028FA32963C0> print(a.__next__()) # 1 print(a.__next__()) # 2 print(a.__next__()) # 3
list set dict可以使用推导式
ls = {x for x in range(100) if x % 2 == 0 if x % 5 == 0}
print(ls) # {0, 70, 40, 10, 80, 50, 20, 90, 60, 30}
input_diet = {'one': 1, 'two': 2, 'three': 3, 'four': 4}
output = {k: v for k, v in input_diet.items() if v % 2 == 0}
print(output)
一些有趣的推导式
1、生成二维列表
>>> [[x, x**2] for x in vec] [[2, 4], [4, 16], [6, 36]]
2、功能等价于map()函数,三大基本函数之一,
>>> freshfruit = [' banana', ' loganberry ', 'passion fruit '] >>> [weapon.strip() for weapon in freshfruit] ['banana', 'loganberry', 'passion fruit']
3 功能相当于filter()函数,代码略,提示,用if
4、双重for循环
>>> vec1 = [2, 4, 6] >>> vec2 = [4, 3, -9] >>> [x*y for x in vec1 for y in vec2] [8, 6, -18, 16, 12, -36, 24, 18, -54] >>> [x+y for x in vec1 for y in vec2] [6, 5, -7, 8, 7, -5, 10, 9, -3] >>> [vec1[i]*vec2[i] for i in range(len(vec1))] [8, 12, -54]
lis = [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y] print(lis) # [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] l = [num for elum in l for num in elum] print(l) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
5、列表推导式可以使用复杂表达式或嵌套函数:
>>> [str(round(355/113, i)) for i in range(1, 6)] ['3.1', '3.14', '3.142', '3.1416', '3.14159']
6、嵌套列表解析
>>> matrix = [ ... [1, 2, 3, 4], ... [5, 6, 7, 8], ... [9, 10, 11, 12], ... ] >>> [[row[i] for row in matrix] for i in range(4)] [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
import math lis = [round(math.pi, x) for x in range(6)] print(lis) # [3.0, 3.1, 3.14, 3.142, 3.1416, 3.14159]

浙公网安备 33010602011771号