如何找到两个词典列表之间的区别?

时间:2014-08-28 15:48:06

标签: python list dictionary set

我有两个词典列表,我想找到它们之间的区别(即第一个列表中存在的但不存在第二个列表,第二个列表中存在但第一个列表不存在)。

问题在于它是一个词典列表

a = [{'a': '1'}, {'c': '2'}]
b = [{'a': '1'}, {'b': '2'}]

set(a) - set(b)

结果

TypeError: unhashable type: 'dict'

期望的结果:

{'c': '2'}

我如何做到这一点?

3 个答案:

答案 0 :(得分:12)

您可以使用in运算符查看它是否在列表中

a = [{'a': '1'}, {'c': '2'}]
b = [{'a': '1'}, {'b': '2'}]

>>> {'a':'1'} in a
True
>>> {'a':'1'} in b
True

>>> [i for i in a if i not in b]
[{'c': '2'}]

答案 1 :(得分:3)

  

我想找出它们之间的区别(即第一个列表中存在但第二个列表中存在的内容,以及第二个列表中存在但第一个列表中不存在的内容

根据您的定义,您正在寻找Symmetric difference

>>> import itertools

>>> a = [{'a': '1'}, {'c': '2'}]
>>> b = [{'a': '1'}, {'b': '2'}]
>>> intersec = [item for item in a if item in b]
>>> sym_diff = [item for item in itertools.chain(a,b) if item not in intersec]

>>> intersec
[{'a': '1'}]
>>> sym_diff
[{'c': '2'}, {'b': '2'}

或者(使用示例中给出的plain difference):

>>> a_minus_b = [item for item in a if item not in b]
>>> b_minus_a = [item for item in b if item not in a]
>>> sym_diff = list(itertools.chain(a_minus_b,b_minus_a))

>>> a_minus_b
[{'c': '2'}]
>>> b_minus_a
[{'b': '2'}]
>>> sym_diff
[{'c': '2'}, {'b': '2'}]

答案 2 :(得分:0)

您也可以filter使用lambda

如果您想要每个列表中的不同项目:

print filter(lambda x: x not in b,a) + filter(lambda x: x not in a,b)

[{'c': '2'}, {'b': '2'}]

或仅filter(lambda x: x not in b,a)获取a但不在b中的元素 如果您不想在内存中创建完整的词典列表,可以使用itertools.ifilter

from itertools import ifilter

diff = ifilter(lambda x: x not in b,a)

然后迭代diff:

for uniq in diff:
   print uniq