帮助python list-comprehension

时间:2010-04-09 12:50:41

标签: python lambda list-comprehension

我的问题的简化版本:

我有一个列表理解,用于在二维列表上设置位标志,所以:

s = FLAG1 | FLAG2 | FLAG3
[[c.set_state(s) for c in row] for row in self.__map]

所有set_state都是:

self.state |= f

这很好但我必须在__map的每个单元格中都有这个函数“set_state”。 __map中的每个单元格都有一个.state,所以我要做的就是:

[[c.state |= s for c in row] for row in self.map]

map(lambda c: c.state |= s, [c for c in row for row in self.__map])

除非两者都不起作用(语法错误)。也许我正在用map / lamda咆哮错误的树,但我想摆脱set_state。也许知道为什么赋值在list-comprehension中不起作用

5 个答案:

答案 0 :(得分:4)

列表推导用于创建列表。您似乎并不关心您正在制作的实际列表,因此您应该使用for语句,如下所示:

for row in self.__map:
    for c in row:
        c.state |= s

答案 1 :(得分:3)

是的,你使用的是错误的工具。列表推导返回一个全新的值,因此您可以这样做:

self.__map = [[c.state | s for c in row] for row in self.__map]

但我的直觉是你应该只使用两个for循环:

for row in self.__map:
    for c in row:
        c.state |= s

在列表理解中,结果必须是表达式。那是因为你的双重理解只是糖:

list1 = []
for row in self.__map:
    list2 = []
    for c in row:
        list2.append(c.state | s)
    list1.append(list2)
self.__map = list1

是没有意义的
        list2.append(c.state |= s)

因为最里面的表达式必须返回要附加到list2的内容。

基本上,每次更新标志时,列表推导都会生成一个完整的自我.__映射副本。如果这就是你想要的,那就去吧。但我怀疑你只想改变现有的地图。在这种情况下,请使用双for循环。

答案 2 :(得分:1)

您不需要列表理解,因为您正在修改数据,而不是创建新列表。

做一个循环。

答案 3 :(得分:0)

使用setattr功能:

setattr(c, "state", s)

然后阅读Statementless Python

答案 4 :(得分:0)

在python中,赋值是语句,而不是仅在lambdas和列表理解中允许的表达式。