推导式

 推导式中的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]

 

posted @ 2020-09-30 09:43  老谭爱blog  阅读(116)  评论(0)    收藏  举报