2010-04-09 107 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和列表理解。