Python for-in循环前面有一个variables
foo = [x for x in bar if x.occupants > 1]
在Google上search之后,无法弄清楚这是什么。 也许我不是在寻找正确的东西,而是在这里。 任何input揭穿这个速记非常赞赏。
目前的答案是好的,但不要谈论他们如何只是句法糖到我们习惯的某种模式。
让我们从一个例子开始,假设我们有10个数字,我们想要一个比5更大的数字。
>>> numbers = [12, 34, 1, 4, 4, 67, 37, 9, 0, 81]
对于上面的任务,下面的方法是完全相同的,从最详细到简洁,可读和pythonic :
方法1
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(input列表理解)
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,空string,空列表等),那么当前的迭代将被跳过(认为continue
)。 如果该函数返回一个非False-y值,那么当前值将它传递给最终的结果数组(并经过上面的转换步骤)。
要以稍微不同的方式理解语法,请看下面的奖金部分。
欲了解更多信息,请按照教程所有其他答案已链接: 列表理解
奖金
(稍微不是pythonic,但为了完整性而放在这里)
上面的例子可以写成:
result = filter(lambda x: x > 5, numbers)
上面的一般expression式可以写成:
result = map(function, filter(condition, numbers)) #result is a list in Py2
这是一个列表理解
foo
将是包含属性占有者> 1的对象的过滤列表
bar
可以是一个list
, set
, dict
或任何其他迭代
这是一个例子来澄清
>>> class Bar(object): ... def __init__(self, occupants): ... self.occupants = occupants ... >>> bar=[Bar(0), Bar(1), Bar(2), Bar(3)] >>> foo = [x for x in bar if x.occupants > 1] >>> foo [<__main__.Bar object at 0xb748516c>, <__main__.Bar object at 0xb748518c>]
所以foo有2个Bar
对象,但是我们如何检查它们是哪个? 让我们给Bar
添加一个__repr__
方法,让它更具信息性
>>> Bar.__repr__=lambda self:"Bar(occupants={0})".format(self.occupants) >>> foo [Bar(occupants=2), Bar(occupants=3)]
这将返回一个列表,其中包含栏中所有占有者> 1的元素。
这种方式应该尽我所能告诉它是检查,看是否列表“栏”是空的(0)或由单身(1)通过x.occupants其中x是在列表栏中定义的项目和可能有占有者的特点。 所以foo被调用,在列表中移动,然后返回所有通过x.occupant检查条件的项目。
在像Java这样的语言中,你会build立一个名为“x”的类,其中“x”对象被分配给一个数组或类似的对象。 X将会有一个名为“居住者”的字段,每个索引都会用x.occupants方法检查,这个方法会返回分配给居住者的号码。 如果该方法返回的值大于1(我们假设这里的int是一个部分占有者,那么这个int就是奇数。)foo方法(在数组或类似的问题上被调用)会返回一个数组或类似于foo方法对于这个容器数组或者你有什么。 返回数组的元素将是符合“大于1”标准的第一个数组thingie中的“x”对象。
Python通过列表理解的内置方法以更简洁和更简单的方式处理这个问题。 我没有实现两个完整的类和几个方法,而是写了一行代码。