正确使用列表推导 - python

时间:2012-01-01 20:59:15

标签: python list-comprehension

通常,列表推导用于从现有列表中派生新列表。例如:

>>> a = [1, 2, 3, 4, 5]
>>> [i for i in a if i > 2]
[3, 4, 5]

我们应该使用它们来执行其他程序吗?例如:

>>> a = [1, 2, 3, 4, 5]
>>> b = []
>>> [b.append(i) for i in a]
[None, None, None, None, None]
>>> print b
[1, 2, 3, 4, 5]

或者我应该避免上述内容并使用以下代码?:

for i in a:
    b.append(i)

5 个答案:

答案 0 :(得分:10)

你确实应该避免使用列表推导(以及字典理解,设置理解和生成器表达式)来产生副作用。除了他们积累虚假名单并因此浪费记忆这一事实之外,它也令人困惑。我期望列表理解能够生成(有意义的)值,许多人会同意。另一方面,循环显然是一系列陈述。预计它们会产生副作用并且不会产生任何结果值 - 毫不奇怪。

答案 1 :(得分:4)

来自python文档:

  

List comprehensions provide a concise way to create lists. Common applications are to make new lists

或许您想了解有关reduce()filter()map()函数的更多信息。

答案 2 :(得分:2)

在你给出的例子中,最有意义的是:

b = [i for i in a]

如果由于某种原因你想创建b。一般来说,必须采用一些常识。如果使用理解使您的代码不可读,请不要使用它。否则就去吧。

答案 3 :(得分:2)

如果您打算使用创建的列表,则仅使用列表推导。否则,您只需为GC创建它而不再使用它。

因此,您应使用正确的for循环代替[b.append(i) for i in a]

for i in a:
    b.append(i)

另一个解决方案是通过生成器表达式:

b += (i for i in a)

但是,如果要附加整个列表,只需执行

即可
b += a

如果您只需要在将元素添加到列表之前将元素应用于元素,则可以始终使用map

b += map(somefunc, a)

答案 4 :(得分:0)

b = []
a = [1, 2, 3, 4, 5]
b.extend (a)