我有一个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
对象不仅包含其子节点。
有没有办法让它更短/更清洁?
答案 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)