关于python:没有’for’的列表理解

List comprehension without 'for'

本问题已经有最佳答案,请猛点这里访问。

通常,在使用Python中的列表时,我最终只希望从列表中筛选出项目。

1
2
numbers = [5, 1, 4, 2, 7, 4]
big_nums = [num for num in numbers if num > 2]

对我来说,这似乎是不必要的冗长。我必须在两个单独的语句(num for num ...中定义和使用num,即使我没有对num执行任何操作。

我试过[num in numbers if num > 2],但python用这个扔了一个SyntaxError

在python中是否有更简洁的方法可以做到这一点?

编辑:

我的问题是,是否有更好的方法来完成我在Python中所做的工作。有很多次,我不知道在Python中有一个构造,但这使我的代码更好,更可读。

我不想问关于filter和列表理解之间的性能权衡。我对列表理解没有问题,但是在我了解列表理解之前,我也对使用标准的for循环构建列表没有问题。


好吧,你可以使用filter,它比较慢,也不可读,但是你不需要for

1
list(filter(lambda x: x > 2, numbers))

或:

1
list(filter((2).__lt__, numbers))

然而,使用这种神奇的方法是脆弱的,只有当列表只包含整数时,这种方法才有效。正如Chris_Rands指出的,你通常使用operator.lt代替:

1
2
3
from functools import partial
from operator import lt
list(filter(partial(lt, 2), numbers))

如果列表中包含除int以外的其他数字类型,这也会起作用。