使用Python列表推导式的帮助

3

我的问题简化如下:

我有一个列表推导式,用于在二维列表上设置位标志,代码如下:

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])

除非两者都不起作用(语法错误),也许我在使用地图/拉姆达时错了,但是我想摆脱set_state。也许知道为什么赋值在列表推导式中不起作用。

5个回答

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循环。

1

你不需要使用列表推导式,因为你是在原地修改数据,而不是创建一个新的列表。

使用循环。


0

0

在Python中,赋值语句是语句而不是表达式,只有在lambda和列表推导式中才允许使用表达式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接