for循环中的清理器赋值(python)

for循环中的清理器赋值(python),python,Python,我有一个nodelist对象,它在迭代中生成一堆节点对象。我需要根据一些随机条件增加这些节点,比如node.x>17。以下是我现在正在做的: for node in nodelist: if node.x > 17: node.x += 1 我无法执行maplambda节点:node.x+=1,nodelist,因为lambda不能包含赋值。我无法执行nodelist=[node.x+1 for nodelist in node if…],因为nodelis

我有一个nodelist对象,它在迭代中生成一堆节点对象。我需要根据一些随机条件增加这些节点,比如node.x>17。以下是我现在正在做的:

for node in nodelist: 
    if node.x > 17: 
        node.x += 1 
我无法执行maplambda节点:node.x+=1,nodelist,因为lambda不能包含赋值。我无法执行nodelist=[node.x+1 for nodelist in node if…],因为nodelist对象不仅仅由其子节点组成


有没有办法让这个更短/更干净

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

我还认为,你所拥有的比我能想出的任何一个对等的行文都更具可读性

好的,也就是说,你可以这样做:

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

甚至可以压缩成一行。但我真的更喜欢你现在的样子

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

我还认为,你所拥有的比我能想出的任何一个对等的行文都更具可读性

好的,也就是说,你可以这样做:

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

甚至可以压缩成一行。但我真的更喜欢你现在的样子

您可以在lambda中实际分配:

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

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

除此之外,您的代码并不是很糟糕-它相当简洁,易于阅读。

您可以在lambda中实际分配:

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

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

除此之外,您的代码并不是很糟糕——它相当简洁,易于阅读。

我认为您做得太过分了:

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


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

我认为你做得太过分了:

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


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

您实际上可以使用lambda:

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

实际上,您可以使用lambda:

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

现在怎么了?这对我来说似乎很简单。-1:作业怎么可能更干净。状态更改是过程编程的绝对核心。赋值语句使状态更改尽可能清晰。很少有事情能像赋值语句那样重要。你的例子似乎使中心的、关键的任务陈述变得模糊和晦涩。现在有什么问题吗?这对我来说似乎很简单。-1:作业怎么可能更干净。状态更改是过程编程的绝对核心。赋值语句使状态更改尽可能清晰。很少有事情能像赋值语句那样重要。你的例子似乎使中心的、关键的任务陈述变得模糊和晦涩。这句话的行数更短,但我怀疑很多人会觉得它更干净。我完全同意你的观点——我只是想指出这种可能性。如果你测试它,这实际上是不起作用的,尽管看起来应该这样做。Try:class Nodeobject:pass,然后doing nodelist=[Node,Node],然后nodelist[0]。x=19;节点列表[1].x=10;若要初始化值,则nodelist[nodelist中节点的node.x]最初为[19,10],在应用代码[operator.iaddnode.x,nodelist中节点的1]后,如果node.x>17,则输出[20],但回头看nodelist时,它仍然是[19,10]。最好还是坚持简单的for循环解决方案。这条线比较短,但我怀疑很多人会觉得它更干净。我完全同意你的观点-我只是想指出这种可能性。如果你测试它,这实际上是不起作用的,尽管看起来应该这样做。Try:class Nodeobject:pass,然后doing nodelist=[Node,Node],然后nodelist[0]。x=19;节点列表[1].x=10;若要初始化值,则nodelist[nodelist中节点的node.x]最初为[19,10],在应用代码[operator.iaddnode.x,nodelist中节点的1]后,如果node.x>17,则输出[20],但回头看nodelist时,它仍然是[19,10]。最好坚持使用简单的for循环解决方案。是的,我必须同意你的for循环是简短而干净的解决方案。除非你的目标是最小的代码竞赛答案,否则你的代码是好的。如果你正在建立一个列表或类似的东西,那么列表理解可能是有意义的。我自己更喜欢这种方法。谢谢。我想这个pythonic概念已经进入我的头脑,现在我对我所有的python代码都感到不安全;是的,我不得不同意你的for循环是一个简洁明了的解决方案。除非你的目标是最小的代码竞赛答案,否则你的代码是好的。如果你正在建立一个列表或类似的东西,那么列表理解可能是有意义的。我自己更喜欢这种方法。谢谢。我想这个蟒蛇的概念已经进入我的头脑,现在
我对我所有的python代码都不安全;我甚至会说OP的原始代码是pythonic,我甚至会说OP的原始代码是pythonic。