帮助解决Python列表推导问题
我遇到的问题简单来说就是:
我有一个列表推导式,用来在一个二维列表上设置位标志,像这样:
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和lambda时走入了误区,我想去掉“set_state”这个函数。同时,我也想知道为什么在列表推导式中赋值不行。
5 个回答
1
你不需要用列表推导式,因为你是在原地修改数据,而不是创建一个新的列表。
用循环来做吧。
4
列表推导式是用来创建列表的。不过看起来你并不在乎自己到底在做什么样的列表,所以你可以直接使用一个 for
循环,像这样:
for row in self.__map:
for c in row:
c.state |= s
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
里。
基本上,每次你更新标志时,列表推导式都会完全复制一份self.__map。如果你就是想这样做,那就继续用它。但我怀疑你其实只是想修改现有的地图。在这种情况下,使用双重for
循环会更合适。