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

wearum 发布于 2019-03-09 dictionary 最后更新 2019-03-09 14:39 5 浏览

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

def merge(self, parent_list, child_list):
    tile_dict = dict(zip(parent_list, child_list))
    return tile_dict
但是,我得到错误“不可取的类型:pygame.Rect”。为此目的不可能使用字典吗?如果是这样,那么对于完成类似于最初预期内容的事情,适当的列表理解是什么?
已邀请:

rvero

赞同来自:

您可以定义从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)]

ueos

赞同来自:

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