Python:如何以“可读”的方式编写Python一行程序?

Python:如何以“可读”的方式编写Python一行程序?,python,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]

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

谢谢

我相信你看到的是:

sum([(abs(candidate-member) in multiset) for member in x])
首先,括号太多了。让我们扔掉我们不需要的东西:

sum(abs(candidate-member) in multiset for member in x)
唷,已经好一点了。现在让我们一块一块地看一下这个表达:

abs(candidate - member) in multiset
这是不言自明的。。。候选对象的绝对值减去多集中的成员?如果是,则表达式返回True;如果不是,则表达式返回False。现在是什么成员?iterable x中的每件事都有一个。所以你在总结一堆真假。在python中,布尔是从int派生的,True==1和False==0,总和基本上是计算我们前面讨论的表达式为True的次数

然后他们检查它是否等于lenx,因此基本上,代码检查表达式对于x中的每个成员是否为真。幸运的是,有一种更好的方法可以用python编写:

all(abs(candidate - member) in multiset for member in x)
如果这仍然令人困惑,我们可以将其重写为函数,让我们称之为fx:


对于一些参考阅读,在这两种情况下,我都使用了在语法和意义上与类似的生成器表达式,但它们会动态生成生成的项,而不是一次具体化整个列表。对于某些操作,它们的内存效率更高,速度更快。在不需要查看每一项就知道结果的情况下,它们特别有用。例如,在这种情况下,一个False就足以使整个表达式为False。

我相信您正在查看的行是:

sum([(abs(candidate-member) in multiset) for member in x])
首先,括号太多了。让我们扔掉我们不需要的东西:

sum(abs(candidate-member) in multiset for member in x)
唷,已经好一点了。现在让我们一块一块地看一下这个表达:

abs(candidate - member) in multiset
这是不言自明的。。。候选对象的绝对值减去多集中的成员?如果是,则表达式返回True;如果不是,则表达式返回False。现在是什么成员?iterable x中的每件事都有一个。所以你在总结一堆真假。在python中,布尔是从int派生的,True==1和False==0,总和基本上是计算我们前面讨论的表达式为True的次数

然后他们检查它是否等于lenx,因此基本上,代码检查表达式对于x中的每个成员是否为真。幸运的是,有一种更好的方法可以用python编写:

all(abs(candidate - member) in multiset for member in x)
如果这仍然令人困惑,我们可以将其重写为函数,让我们称之为fx:


对于一些参考阅读,在这两种情况下,我都使用了在语法和意义上与类似的生成器表达式,但它们会动态生成生成的项,而不是一次具体化整个列表。对于某些操作,它们的内存效率更高,速度更快。在不需要查看每一项就知道结果的情况下,它们特别有用。例如,在这种情况下,一个False就足以使整个表达式为False。

这段代码似乎使用了一种称为列表理解的高级功能。不懂Python的人不懂是可以理解的。这就是我所想的,它一定使用了一些高级Python特性。您能用简单的方式重新编写吗?代码不是确定性的,因为结果取决于deltaSet上的迭代顺序。这让我觉得不管它做什么,它都是不正确的。看起来这段代码使用了一种叫做列表理解的高级功能。不懂Python的人不懂是可以理解的。这就是我所想的,它一定使用了一些高级Python特性。您能用简单的方式重新编写吗?代码不是确定性的,因为结果取决于deltaSet上的迭代顺序。这让我觉得它不正确,不管它是什么。非常感谢你的详细解释。它真的帮助我理解了代码。总数/总数仍然使我困惑。你能用多个循环来写这是Java吗?@Retr0spect-我不确定我能用Java来写,因为我对Java不太了解,我不记得如何用Java来做forEach循环,或者你是否能。。。。我可以并且已经将all表达式编写为一个非常基本的python函数。希望这会有帮助。谢谢米吉尔森,我真的很感谢你的帮助。编辑:我已经用Java重新编写了代码,但由于某些原因,它没有产生预期的输出。我不知道我做错了什么。非常感谢你的详细解释。它真的帮助我理解了代码。总数/总数仍然使我困惑。你能用多个循环写这是Java吗?@Retr0spect-我不确定我能用Java写它,因为我对Java不太了解,我也不太了解Java
请记住如何在Java中执行forEach循环,或者您是否可以。。。。我可以并且已经将all表达式编写为一个非常基本的python函数。希望这会有帮助。谢谢米吉尔森,我真的很感谢你的帮助。编辑:我已经用Java重新编写了代码,但由于某些原因,它没有产生预期的输出。我不知道我做错了什么。