Simular到this问题,我想知道两个词典列表之间的交集。
其他问题询问如何在列表中获取字典的交集:
>>> dicts = [dict(a=3, b=89, d=2), dict(a=3, b=89, c=99), dict(a=3, b=42, c=33)]
解决方案是:
dict(set.intersection(*(set(d.iteritems()) for d in dicts)))
但是我想知道如何获得两个词典列表的交集,不得到内部词典的交集。
如果我有:
>>> dicts1 = [dict(a=3, b=89, d=2), dict(a=3, b=89, c=99), dict(a=3, b=42, c=33)]
>>> dicts2 = [dict(a=3, b=89, d=2), dict(a=1, b=89, c=99), dict(a=0, b=42, c=33)]
我想要
{a=3m, b=89, b=42}
打印不是因为它发生在dicts1中的所有字典中,而是因为它发生在dicts1中的字典和dict2中的字典中。我不关心每个阵列的位置。只是它发生了。
答案 0 :(得分:1)
这样的事情怎么样(注意如果你有一个固定的键列表,你不需要第一行):
keys = set([y for x in dicts1 for y in x.keys() ] + [y for x in dicts2 for y in x.keys() ])
for key in keys:
valsDicts1 = set([x[key] for x in dicts1 if key in x])
valsDicts2 = set([x[key] for x in dicts2 if key in x])
print key, list(valsDicts1 & valsDicts2)
打印您的示例:
a [3]
c [33, 99]
b [89, 42]
d [2]
显然,如果您不想打印它,请在最后一行做其他事情。