Python for-in循环前面有一个变量

时间:2011-06-25 01:58:58

标签: python for-loop for-in-loop

foo = [x for x in bar if x.occupants > 1]

在Google上搜索并搜索后,无法弄清楚这是做什么的。也许我没有找到合适的东西但是在这里。非常感谢任何揭穿这种速记的输入。

5 个答案:

答案 0 :(得分:59)

目前的答案很好,但是不要谈论它们只是syntactic sugar对于我们习以为常的某种模式。

让我们从一个例子开始,假设我们有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(输入列表理解)

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

答案 1 :(得分:25)

这是list comprehension

foo将是bar的过滤列表,其中包含具有属性占有者的对象> 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个对象,但是我们如何检查它们是哪个?让我们向__repr__添加Bar方法,以便提供更多信息

>>> Bar.__repr__=lambda self:"Bar(occupants={0})".format(self.occupants)
>>> foo
[Bar(occupants=2), Bar(occupants=3)]

答案 2 :(得分:0)

这返回一个列表,其中包含栏中具有占用者的所有元素&gt; 1。

答案 3 :(得分:0)

据我所知,它的工作方式是检查列表“bar”是否为空(0)或由x.occupants组成的单例(1)其中x是一个已定义的项目列表栏并可能具有占用者的特征。所以foo被调用,在列表中移动然后返回所有通过检查条件的项目,即x.occupant。

在像Java这样的语言中,你要构建一个名为“x”的类,然后将“x”对象分配给一个数组或类似的对象。 X将有一个名为“占用者”的字段,并且将使用x.occupants方法检查每个索引,该方法将返回分配给占用者的数字。如果该方法返回大于1(我们假设这里的一个int作为部分占用者将是奇数。)foo方法(在数组上调用或类似的相似。)将返回一个数组或类似于foo方法中定义的对于这个容器数组或你有什么。返回数组的元素将是符合“大于1”条件的第一个数组中的“x”对象。

Python通过列表理解具有内置方法,以更加简洁和大大简化的方式处理这个问题。我没有实现两个完整的类和几个方法,而是编写了一行代码。

答案 4 :(得分:0)

由于问题的编程部分已由其他人完全回答,因此很高兴知道其与数学的关系(set theory)。实际上是Python implementation of Set builder notation

通过axiom of specification定义集合:

B = {xєA:S(x)}

英语翻译: B 是从 A 中选择其成员的集合, 因此 B A (B⊂A)的子集,其中 函数 S 保持:S(x) == True

使用列表理解定义 B

B = [如果S(x),则x表示A中的x]

因此要使用list comprehension构建 B ,请从集中选择 B 的成员(用 x 表示) A ,其中S(x) == True(包含条件)。

注意:返回布尔值的函数S被称为predicate