我已经开始学习Python了。我对此代码中使用的单行代码感到困惑(下面代码中的第5行)。
有人可以向我解释这个衬垫是如何工作的吗?可能会以冗长的方式重写吗?
multiset = [2, 2, 3, 3, 4, 5, 6, 7, 8, 10]
x = [0]
deltaSet = set(multiset)
for candidate in deltaSet:
if sum([(abs(candidate-member) in multiset) for member in x]) == len(x):
for member in x:
multiset.remove(abs(candidate-member))
x.append(candidate)
if len(x) == n: break
谢谢!
答案 0 :(得分:7)
我相信你正在看的那条线是:
sum([(abs(candidate-member) in multiset) for member in x])
首先,那里有太多的括号。让我们摆脱我们不需要的东西:
sum(abs(candidate-member) in multiset for member in x)
P,嗯,已经好一点了。现在让我们一块一块地看一下表达式:
abs(candidate - member) in multiset
这是足够自我解释的......候选人的绝对值是否减去了多重集中的成员?如果是,则表达式返回True
,否则表达式返回False
。现在member
是什么?好吧,可迭代的x
中的每个东西都有一个。因此,您需要汇总一大堆True
和False
。在python中,布尔值是int
(带True == 1
和False == 0
)的子类,总和基本上计算我们之前谈到的表达式True
的次数。< / p>
然后他们检查它是否等于len(x)
所以基本上,代码正在检查True
中每个成员的表达式是否为x
。幸运的是,有一种更好的方法可以在python中编写它:
all(abs(candidate - member) in multiset for member in x)
如果这仍然令人困惑,我们可以将其重写为一个函数(让我们称之为f(x)
:
def f(x):
"""Equivalent to `all(abs(candidate - member) in multiset for member in x."""
for member in x:
if not abs(candidate - member) in multiset:
return False
return True
对于一些参考阅读,在这两种情况下,我都使用了生成器表达式(在语法和含义上类似于list-comprehensions,但它们生成了项目&#34;产生了&#34;而不是一次性实现整个列表。它们对于某些操作来说更有效,更快。对于不需要查看每个项目以了解结果的情况,它们特别有用。 (例如,这一个False
足以构成整个表达式False
)。