两个字典列表的交集?

时间:2013-07-19 16:46:21

标签: python dictionary

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中的字典中。我不关心每个阵列的位置。只是它发生了。

1 个答案:

答案 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]

显然,如果您不想打印它,请在最后一行做其他事情。