当前的答案很好,但不要谈论它们如何只是syntactic sugar 对我们如此习惯的某些模式。
让我们从一个例子开始,假设我们有 10 个数字,我们想要一个大于 5 的数字的子集。
>>> numbers = [12, 34, 1, 4, 4, 67, 37, 9, 0, 81]
对于上述任务,以下方法完全相同,从最冗长到简洁、易读和pythonic:
方法一
result = []
for index in range(len(numbers)):
if numbers[index] > 5:
result.append(numbers[index])
print result #Prints [12, 34, 67, 37, 9, 81]
方法 2(更简洁的 for-in 循环)
result = []
for number in numbers:
if number > 5:
result.append(number)
print result #Prints [12, 34, 67, 37, 9, 81]
方法3(输入列表理解)
result = [number for number in numbers if number > 5]
或更笼统地说:
[function(number) for number in numbers if condition(number)]
地点:
-
function(x) 接受 x 并将其转换为有用的东西(例如:x*x)
- 如果
condition(x) 返回任何 False-y 值(False、None、空字符串、空列表等),则将跳过当前迭代(想想continue)。如果函数返回一个非 False-y 值,则当前值将成为最终结果数组(并经过上述转换步骤)。
要以稍微不同的方式理解语法,请查看下面的奖励部分。
有关更多信息,请按照所有其他答案链接的教程进行操作:List Comprehension
奖金
(有点不像pythonic,但为了完整起见将其放在这里)
上面的例子可以写成:
result = filter(lambda x: x > 5, numbers)
上面的一般表达式可以写成:
result = map(function, filter(condition, numbers)) #result is a list in Py2