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可以是一个listsetdict或任何其他迭代

这是一个例子来澄清

 >>> 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通过列表理解的内置方法以更简洁和更简单的方式处理这个问题。 我没有实现两个完整的类和几个方法,而是写了一行代码。