foo = [x for x in bar if x.occupants > 1]
在谷歌搜索和搜索后,无法弄清楚这是做什么的。也许我没有寻找正确的东西,但它就在这里。非常感谢揭穿这种速记的任何输入。
foo = [x for x in bar if x.occupants > 1]
在谷歌搜索和搜索后,无法弄清楚这是做什么的。也许我没有寻找正确的东西,但它就在这里。非常感谢揭穿这种速记的任何输入。
当前的答案很好,但不要谈论它们如何只是我们习惯的某种模式的语法糖。
让我们从一个例子开始,假设我们有 10 个数字,我们想要一个大于 5 的数字的子集。
>>> numbers = [12, 34, 1, 4, 4, 67, 37, 9, 0, 81]
对于上述任务,以下方法完全相同,从最冗长到简洁、易读和Python 化:
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 值,则当前值使其成为最终结果数组(并通过上述转换步骤)。要以稍微不同的方式理解语法,请查看下面的 Bonus 部分。
有关更多信息,请按照所有其他答案链接的教程:列表理解
(有点不像pythonic,但为了完整起见把它放在这里)
上面的例子可以写成:
result = filter(lambda x: x > 5, numbers)
上面的一般表达式可以写成:
result = map(function, filter(condition, numbers)) #result is a list in Py2
这是一个列表理解
foo
将是bar
包含属性 occupants > 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)]
由于问题的编程部分已被其他人完全回答,因此很高兴知道它与数学(集合论)的关系。实际上它是Set builder notation 的 Python 实现:
通过规范公理定义一个集合:
B = { x є A : S(x) }
英文翻译:B是一个集合,其成员选自A,因此B是A (B ⊂ A) 的子集,其中函数S指定的特征成立:
S(x) == True
使用列表推导定义B :
B = [x for x in A if S(x)]
因此,要使用列表理解构建B ,从集合A where (包含条件)中选择B的成员(由x表示)。S(x) == True
注意:S
返回布尔值的函数称为predicate。
这将返回一个列表,其中包含 bar 中所有居住者 > 1 的元素。
据我所知,这应该起作用的方式是检查列表“栏”是否为空(0)或通过 x.occupants 由单例(1)组成,其中 x 是列表栏中的已定义项目和可能具有居住者的特点。所以 foo 被调用,在列表中移动,然后返回所有通过检查条件的项目,即 x.occupant。
在像 Java 这样的语言中,您将构建一个名为“x”的类,然后将“x”对象分配给一个数组或类似的对象。X 将有一个名为“occupants”的字段,并且将使用 x.occupants 方法检查每个索引,该方法将返回分配给 occupant 的数字。如果该方法返回大于 1(我们假设这里的 int 作为部分占用者会很奇怪。) foo 方法(在数组上调用或类似的问题。)然后将返回一个数组或类似的数组,如 foo 方法中定义的那样对于这个容器阵列或你有什么。返回数组的元素将是第一个数组中符合“大于 1”标准的“x”对象。
Python 有通过列表理解的内置方法,以更简洁和大大简化的方式处理这个问题。我没有实现两个完整的类和几个方法,而是编写了一行代码。