2010-04-09 69 views
3

我的问题的一个简化版本:帮助与Python列表理解

我有一个列表理解,我使用二维列表等设置bitflags:

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。也许知道为什么赋值不能在列表中理解

回答

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

4

列表解析用于创建列表。你似乎并不关心你在做实际的列表,所以你应该只使用一个for声明,就像这样:

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

你不想要一个列表理解,因为你正在修改你的数据,而不是创建一个新列表。

做一个循环。

0

在python的作业是语句,而不是表达式只允许在lambdas和列表理解。