如何找到两个字典列表之间的差异?

19 投票
3 回答
11682 浏览
提问于 2025-04-18 18:51

我有两个字典列表,我想找出它们之间的不同之处(也就是说,哪些在第一个列表中但不在第二个列表中,哪些在第二个列表中但不在第一个列表中)。

问题在于这是一个字典的列表。

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

set(a) - set(b)

结果

TypeError: unhashable type: 'dict'

期望的结果:

{'c': '2'}

我该怎么做呢?

3 个回答

1

你还可以用 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
4

我想找出它们之间的区别(也就是说,第一份列表中有但第二份列表中没有的内容,以及第二份列表中有但第一份列表中没有的内容

根据你的定义,你在寻找一个对称差集

>>> 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'}

另外(使用普通差集,就像你例子中给出的那样):

>>> 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'}]
24

你可以使用 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'}]

撰写回答