foo = [x for x in bar if x.occupants > 1]
在Google上搜索并搜索后,无法弄清楚这是做什么的。也许我没有找到合适的东西但是在这里。非常感谢任何揭穿这种速记的输入。
答案 0 :(得分:59)
目前的答案很好,但是不要谈论它们只是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]
result = []
for number in numbers:
if number > 5:
result.append(number)
print result #Prints [12, 34, 67, 37, 9, 81]
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)
foo
将是bar
的过滤列表,其中包含具有属性占有者的对象> 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
个对象,但是我们如何检查它们是哪个?让我们向__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。