我的问题的简化版本:
我有一个列表理解,用于在二维列表上设置位标志,所以:
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中不起作用
答案 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)
答案 4 :(得分:0)
在python中,赋值是语句,而不是仅在lambdas和列表理解中允许的表达式。