比较两个值为列表的字典

2 投票
2 回答
3810 浏览
提问于 2025-04-16 12:12

我正在尝试比较两个字典。我的方法是把它们转换成两个独立的元组列表,然后使用集合模块。下面是一个示例:

dict = {'red':[1,2,3],'blue':[2,3,4],'green':[3,4,5]}

dict1 = {'green':[3,4,5],'yellow':[2,3,4],'red':[5,2,6]}

intersection = set(set(dict.items()) & set(dict1.items()))

显然,这样是在比较两个元组列表,而Python对此不太满意。我遇到了一个类型错误:'list'是不可哈希的错误(或者类似的说法)。

我希望交集能包含 [('green',[3,4,5])]。有什么想法吗?

2 个回答

3

列表是可以改变的,所以它们不能被用来生成哈希值。哈希值是用来创建集合的基础。因为上面两个字典里的值是列表,所以不能用它们来创建集合。不过,如果把这些值的类型从列表改成元组(元组是不可改变的),那么就可以创建集合并进行集合操作了。

>>> dict1 = {'blue': (2, 3, 4), 'green': (3, 4, 5), 'red': (1, 2, 3)}
>>> dict2 = {'green': (3, 4, 5), 'yellow': (2, 3, 4), 'red': (5, 2, 6)}
>>> list(set(dict1.items()) & set(dict2.items()))
[('green', (3, 4, 5))]
6
shared_keyvals = dict( (key, dict1[key])
                       for key in (set(dict1) & set(dict2))
                       if dict1[key] == dict2[key]
                     )

你甚至可以把这个做成一个函数:

def shared_keyvals(dict1, dict2):
    return dict( (key, dict1[key])
                 for key in (set(dict1) & set(dict2))
                 if dict1[key] == dict2[key]
               )

显然,如果你不想要字典形式的输出,可以直接去掉 dict() 这个调用,改用列表推导式的括号 ([]) 来代替。

撰写回答