将列表与列表列表合并到字典中

时间:2013-04-11 16:31:09

标签: python list dictionary pygame

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

这就是我的尝试:

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

但是我收到错误“Unhashable type:pygame.Rect”。是不是可以为此目的使用词典?如果是这样,什么是适当的列表理解,以完成与最初的目的类似的东西?

2 个答案:

答案 0 :(得分: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)]

答案 1 :(得分:0)

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