2013-04-11 99 views
0

我希望能夠使用來自其他列表的對象從字典中引用列表。第一個列表是矩形對象列表,第二個列表是從第一個列表中分割出來的較小的矩形對象列表。將列表與列表列表合併到一本字典中

這是我的嘗試:

def merge(self, parent_list, child_list): 
    tile_dict = dict(zip(parent_list, child_list)) 
    return tile_dict 

但是我得到的錯誤 「Unhashable類型:pygame.Rect」。爲此目的不可能使用字典嗎?如果是這樣,那麼對於完成類似於最初預期內容的事情,適當的列表理解是什麼?

+0

你能告訴我們更多關於'rect'對象嗎?他們是否可變?如果不是這樣,你可以通過提供某種形式的'__hash__'方法使它們變得可靠。 – mgilson 2013-04-11 16:40:28

+0

它們是具有位置,寬度和高度的pygame矩形對象。 – 2013-04-11 16:47:27

回答

4

你可以定義從pygame.Rect派生自己的類:

class HashableRect(pygame.Rect): 
    def __hash__(self): 
     return hash(tuple(self)) 

正常工作:

>>> r = HashableRect(1,2,3,4) 
>>> {r: 'something'} 
{<rect(1, 2, 3, 4)>: 'something'} 

的問題與此:pygame.Rect是一個可變的類型。你可以改變它所包含的值,因此哈希值會改變,這不應該發生。

如果您只關心對象標識,則可以返回id(self)作爲散列值。

或者你也可以只將其轉換爲一個元組(這基本上是沒有太大的那麼一個四元組反正),並使用該做的查找時作爲字典鍵:

def merge(self, parent_list, child_list): 
    tile_dict = dict(zip(map(tuple, parent_list), child_list)) 
    return tile_dict 

merged = merge(prarent_list, child_list) 
... 
child = merged[tuple(parent)] 
+0

你的答案的第二部分很好地解決了它。 – 2013-04-11 18:28:36

0

鍵的字典必須是可散列的,這意味着它們必須有一個__hash__方法,如果對象具有相同的「值」並且在對象的生命週期中永不改變,則該方法會產生相同的輸出。 如果適用,您必須提供該散列方法,或者通過保留兩個列表的列表並查找父代的每個索引的子代來模擬字典。這工作,但會O(n)查找成本。

相關問題