2011-05-11 82 views
1

我有一个nodelist对象,它在迭代时会产生一堆node对象。我需要根据一些随机条件来增加这些节点(如node.x > 17)。下面是我在做什么现在:for循环中的清除器赋值(python)

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

我不能这样做,因为map(lambda node: node.x += 1, nodelist)拉姆达不能包含分配。我不能做nodelist = [node.x + 1 for node in nodelist if...],因为一个nodelist对象不仅仅是它的子节点。

有没有办法让这个更短/清洁?

+6

现在有什么错呢?这对我来说很简单。 – 2011-05-11 18:52:04

+0

-1:指派如何“更清洁”。程序编程绝对是国家变革的核心。赋值语句使状态变化尽可能清晰。很少有事情可以和转让声明一样重要。你的例子似乎使中心,关键的任务陈述模糊不清。 – 2011-05-11 20:35:15

回答

7

我认为它已经非常短暂和干净。 Python提供了一些强大的工具,但有时候简单是最好的;这似乎是其中的一次。

我也认为你所拥有的比任何同等的单线(我可以想出)更具可读性。


好吧,这么说,你可以这样做:

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

这甚至可以被压缩成一条线。但我真的很喜欢你现在拥有的方式。

+0

是的,我不得不同意你的for循环是简短而干净的解决方案。除非你打算做一些“最小代码”竞赛的答案,否则你的代码是好的。如果你正在创建一个列表或其他类似的列表,那么列表理解可能是合理的。 – 2011-05-11 19:01:55

+0

我更喜欢这种方法。 – zeekay 2011-05-11 19:05:01

+0

谢谢。我想这个“pythonic”概念已经到了我的头上,现在我对我所有的python代码都不安全;) – ash 2011-05-11 19:24:26

3

实际上,你可以指定一个拉姆达:

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

分别

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

分开,你的代码是不是真的坏 - 那是相当的简洁,易于阅读的是。

+2

这个比较短(按行),但我怀疑很多人会觉得它更干净。 – rmmh 2011-05-11 18:57:15

+0

我完全同意你的看法 - 我只想指出可能性。 – 2011-05-11 18:58:19

+1

如果你测试它,这实际上不起作用(尽管看起来应该是这样)。尝试:'Node Node(object):pass',然后执行'nodelist = [Node(),Node()]',然后'nodelist [0] .x = 19;节点列表[1]。x = 10;'初始化值,然后nodelist('[节点node.xml中的节点node.x])最初是'[19,10]'并且在应用你的代码'[operator.iadd(node.x,1)对于节点列表中的节点,如果node.x> 17]'它输出[20],但是回看节点列表中它的未改变 - 仍然[19,10]。最好坚持简单的循环解决方案。 – 2011-05-11 19:14:24

0

我投票认为你过分这个pythonic的东西:)

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

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

+1

我甚至会在肢体上出去,并说OP的原始代码是pythonic。 – senderle 2011-05-11 19:08:16

0

您可以实际使用的λ:

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