2013-07-19 110 views
1

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

'b = 89'?它有资格吗? – iruvar

+1

我同意@ 1_CR ...在给定的例子中有很多东西通过你的标准...为什么它只返回'{a = 3}'? – SethMMorton

+0

问题目前的表述方式,您要求列出包含两个输入列表中包含的字典。我不认为这是你想要问的。 – user2357112

回答

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] 

显然,如果你不想打印它,就用最后一行做一些其他的事情。