for循环中的清洁程序赋值(python)

时间:2011-05-11 18:48:42

标签: python

我有一个nodelist对象,在迭代时会产生一堆node个对象。我需要根据一些随机条件(如node.x > 17)递增这些节点。这就是我现在正在做的事情:

for node in nodelist: 
    if node.x > 17: 
        node.x += 1 

我不能map(lambda node: node.x += 1, nodelist)因为lambda不能包含赋值。我不能nodelist = [node.x + 1 for node in nodelist if...],因为nodelist对象不仅包含其子节点。

有没有办法让它更短/更清洁?

4 个答案:

答案 0 :(得分:7)

我认为它已经很短而干净了。 Python提供了一些强大的工具,但有时简单是最好的;这似乎是其中一个时代。

我也认为你所拥有的东西比任何等效的单行程都更具可读性(我可以提出)。


好的,那说,你可以这样做:

for node in (n for n in nodelist if condition):
    node.x += 1

甚至可以压缩成一行。但老实说,我更喜欢你现在的方式。

答案 1 :(得分:3)

您实际上可以在lambda中分配:

import operator
map(lambda node: operator.iadd(node.x,1), nodelist)
分别

[operator.iadd(node.x,1) for node in nodelist if ...]

除此之外,你的代码并不是很糟糕 - 它非常简洁,易于阅读。

答案 2 :(得分:0)

我投票说你这个pythonic的东西太过分了:)

你的目标是什么:表现?我怀疑你会得到任何。

可读性?好吧,对于三行,我不确定在这种情况下功能崩溃是否会有所帮助,因为它显然不会那么明显。

答案 3 :(得分:0)

你实际上可以使用lambda:

map(lambda node: node.x>17 and node.x+1 or node.x, nodelist)