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() and map()
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
[('猪', '鸡'), ('猪', '鸭'), ('猪', '鹅'), ('牛', '鸡'), ('牛', '鸭'), ('牛', '鹅'), ('羊', '鸡'), ('羊', '鸭'), ('羊', '鹅')]