帮助解决Python列表推导问题

3 投票
5 回答
667 浏览
提问于 2025-04-15 21:25

我遇到的问题简单来说就是:

我有一个列表推导式,用来在一个二维列表上设置位标志,像这样:

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循环会更合适。

撰写回答