Python
308 浏览 5 years, 9 months
17.9 列表生成式(list comprehensions)
版权声明: 转载请注明出处 http://www.codingsoho.com/列表生成式(list comprehensions)
如何生成列表
- 普通循环
- 列表生成式
格式
[exp for iter_var in iterable if exp1]
- [formula for 循环],
if
条件可选 - 迭代iterable中的每个元素,判断
if
条件; - 每次迭代都先把条件为真的迭代结果赋值给
iter_var
,然后通过exp
得到一个新的计算值 - 最后把所有通过
exp
得到的计算值以一个新列表的形式返回 - Easy way to avoid unnecessary chunks of code
- Can be nested
- It is possible to easily achieve the same result with list comprehensions as with
filter()
andmap()
for循环嵌套
[exp for iter_var_A in iterable_A for iter_var_B in iterable_B]
每迭代iterable_A
中的一个元素,就把ierable_B
中的所有元素都迭代一遍
formula里可以使用多个变量
一次性生成所有的列表单元
代码示例
示例: 生成一个2n+1的数字列表,n为3到11的数字
不使用列表生成式的实现
>>> list = []
>>> for n in range(3,11):
... list.append(2*n+1)
...
>>> list
[7, 9, 11, 13, 15, 17, 19, 21]
使用列表生成式的实现
>>> list = [2*n+1 for n in range(3,11)]
>>> list
[7, 9, 11, 13, 15, 17, 19, 21]
示例: 过滤一个指定的数字列表中值大于20的数字
不使用列表生成式的实现
>>> L = [3,7,11,14,34,37,78,99]
>>> list = []
>>> for x in L:
... if x < 20:
... list.append(x)
...
使用列表生成式的实现
>>> list = [x for x in L if x > 20]
>>> list
[34, 37, 78, 99]
示例: 计算两个集合的全排列,并将结果保存至一个新的列表中
不使用列表生成式的实现
>>> L1 = ['猪','牛','羊']
>>> L2 = ['鸡','鸭','鹅']
>>> list = []
>>> for x in L1:
... for y in L2:
... list.append((x,y))
使用列表生成式的实现
>>> list = [(x,y) for x in L1 for y in L2]
>>> list
[('猪', '鸡'), ('猪', '鸭'), ('猪', '鹅'), ('牛', '鸡'), ('牛', '鸭'), ('牛', '鹅'), ('羊', '鸡'), ('羊', '鸭'), ('羊', '鹅')]