<pre><code> lst = [dict_a,dict_b,dict_c]
total_intersect_key = set(dict_a) & set(dict_b) & set(dict_c)
total_intersect = { k:[ item[k] for item in lst ] for k in total_intersect_key}
</code></pre>
<p>输出:</p>
<pre><code>{1: [488, 61, 1.15], 2: [336, 0, 0.11]}
</code></pre>
<p>对于其他问题,只需减少lst元素</p>
<pre><code>lst = [dict_a,dict_b]
A&B_only_intersect = { k:[ item[k] for item in lst ] for k in set(dict_a.keys) & set(dict_b)}
</code></pre>
<p>还可以将其转换为函数</p>
<pre><code>def intersect(lst):
return { k:[ item[k] for item in lst if k in item ] for k in reduce( lambda x,y:set(x)&set(y), lst ) }
</code></pre>
<p>示例:</p>
<pre><code>>>> a
{1: 488, 2: 336, 3: 315, 4: 291, 5: 275}
>>> b
{1: 61, 2: 0, 3: 33, 5: 90, 15: 58}
>>> c
{1: 1.15, 2: 0.11, 9: 0, 15: 0.86, 19: 0.008, 20: 1834}
>>> intersect( [a,b] )
{1: [488, 61], 2: [336, 0], 3: [315, 33], 5: [275, 90]}
>>> intersect( [a,c] )
{1: [488, 1.15], 2: [336, 0.11]}
>>> intersect( [b,c] )
{1: [61, 1.15], 2: [0, 0.11], 15: [58, 0.86]}
>>> intersect( [a,b,c] )
{1: [488, 61, 1.15], 2: [336, 0, 0.11]}
</code></pre>
<p>-更新-</p>
<pre><code>def func( lst, intersection):
if intersection:
return { k:[ item[k] for item in lst if k in item ] for k in reduce( lambda x,y:set(x)&set(y), lst ) }
else:
return { k:[ item[k] for item in lst if k in item ] for k in reduce(lambda x,y:set(x).difference(set(y)), lst ) }
>>> func([a,c],False)
{3: [315], 4: [291], 5: [275]}
>>> func([a,b],False)
{4: [291]}
>>> func( [func([a,b],False),func([a,c],False)],True)
{4: [[291], [291]]}
</code></pre>
<p>一个问题是:为了最终的结果,你需要把复制品拿出来,或者尝试改进func本身。你知道吗</p>
<pre><code>{k:set( reduce( lambda x,y:x+y, v) ) for k,v in func( [func([a,b],False),func([a,c],False)],True).iteritems()}
{4: set([291])}
</code></pre>