0

我希望能够通过使用另一个列表中的对象来引用字典中的列表。第一个列表是矩形对象的列表,第二个列表是从第一个列表中划分出来的较小矩形对象的列表。

这是我尝试过的:

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

但是我收到错误“Unhashable type: pygame.Rect”。不能为此目的使用字典吗?如果是这样,完成与最初预期类似的事情的适当列表理解是什么?

4

2 回答 2

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)则可以作为哈希值返回。

或者您也可以将其转换为元组(它基本上不超过 4 元组)并将其用作 dict 中的键和进行查找时:

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)]
于 2013-04-11T16:44:17.857 回答
0

字典的键必须是可散列的,这意味着它们必须有一个__hash__方法,如果对象具有相同的“值”并且在对象的生命周期内永远不应该改变,则该方法会产生相同的输出。如果适用,您必须提供该哈希方法,或者您通过保留两个列表的列表来模拟 dict 并根据父项的索引查找子项。这可行,但将是 O(n) 查找成本。

于 2013-04-11T16:47:10.620 回答