Python中的List Comprehensions(列表推导式/列表解析式).md
一、引入
初学Python的同学经常会遇到一些看起来很简洁,但又不是很好理解的语句,例如下面的
squares = [x * x for x in range(10)]
print(squares)
上面这个写法如果用普通写法就等同于如下
squares = []
for x in range(10):
squares.append(x*x)
print(squares)
其输出结果如下
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
这种就是Python的列表推导式(List Comprehensions),它可以让代码更简洁,并且可以增加可读性和执行效率。
这些写法常被称作语法糖(Syntactic sugar)。
二、基本语法
列表推导式是一种创建列表的方式,所以列表推导式的返回结果就是一个列表。
列表推导式的基本语法如下:
new_list = [expression(i) for i in old_list if condition(i)]
#*result* = [*transform* *iteration* *filter* ]
三、常见例子
x = [i for i in range(10)]
#获取其中的偶数
print([i for i in x if i%2==0])
#对每个元素求平方
print([i**2 for i in x])
words = ["this","is","a","list","of","words"]
#取每个单词的首字母
print( [word[0] for word in words])
d = {'a':1,'b':2,'c':3}
#筛选 value 值
print([i for i in d.values() if i >1])
#获取 key 值列表,并且可以加 if 判断
print([i for i in d.keys()])
四、扩展-多个for的列表推导式
列表推导式不是只能有一个for循环,使用多个for时相当于嵌套的for循环,例如
list=[1,2,3,4,5]
newlist=[x*y for x in list for y in range(5) if x > 3]
print(newlist)
其含义如果用原始语句表达如下
nlist=[]
for x in list:
for y in range(0,5):
if x > 3 :
nlist.append(x*y)
print(nlist)
五、扩展-字典推导式
除了列表list,Python中的字典dict也支持同样的推导式
dict = {x: x*x for x in [1, 2, 3]}
print(dict)
some_dict={'a':1, 'b':2, 'c':3}
#快速对换Key和Value的位置
print({v: k for k, v in some_dict.items()})
既然列表、字典都有推导式,那元组是不是也有呢?
把[]改成() 不是就可以了呢?很遗憾,如果[]改成()就变成了生成器对象,后面我们再介绍。
六、参考资料
https://www.python.org/dev/peps/pep-0202/
https://juejin.im/post/5b3b2d9ce51d45191556b2ef
https://www.fearlazy.com/index.php/post/152.html