Python:如何以“可读”的方式编写这个python单行程?

时间:2016-07-06 03:55:24

标签: python

我已经开始学习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

谢谢!

1 个答案:

答案 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中的每个东西都有一个。因此,您需要汇总一大堆TrueFalse。在python中,布尔值是int(带True == 1False == 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)。