我正在尝试比较两个词典。我的方法是将它们变成两个单独的元组列表,然后使用set模块。这是一个例子:
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不喜欢这样。我得到一个TypeError:'list'是不可用的错误(或类似的措辞)。
我希望交集包含[('green',[3,4,5])]
。有什么想法吗?
答案 0 :(得分: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()
调用并替换为列表推导括号([]
)。
答案 1 :(得分:2)
列表是可变的,因此不可清除。一组只能用可打印的物品建造。由于上面两个dicts中的值是列表,因此无法构建集合。但是,如果要将值的类型从列表更改为元组(这是不可变的),则可以构建集合并执行集合操作。
>>> 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))]