在for循环中更简洁的赋值(python)

1 投票
4 回答
2523 浏览
提问于 2025-04-16 17:28

我有一个叫做 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

你可以实际上使用lambda:

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

其实你可以在一个lambda表达式里进行赋值:

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

除此之外,你的代码其实并不差 - 现在的写法简洁明了,容易理解。

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

我觉得这段代码已经很简洁明了了。Python提供了一些强大的工具,但有时候简单的方式更好;这似乎就是这样的一个例子。

我还认为你现在的写法比任何我能想到的单行代码都更容易理解。


好吧,既然这样,你可以这样做:

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

这甚至可以压缩成一行代码。但老实说,我更喜欢你现在的写法。

撰写回答