Python 查找字典列表之间的差异

Python 查找字典列表之间的差异,python,list,dictionary,diff,Python,List,Dictionary,Diff,我需要得到一个列表中多个词典之间的差异。我所拥有的: [{'WWW': '1.1.1.1', 'Dom': '1.1.1.1', 'SPF': None, 'MX': '1.1.1.1', 'PTR': 'reverse.dom.com'}, {'WWW': '1.1.1.1', 'Dom': '1.1.1.1', 'SPF': None, 'MX': '1.1.1.1', 'PTR': 'reverse.dom.com'}, {'WWW': '2.2.2.2', 'Dom': '2.2

我需要得到一个列表中多个词典之间的差异。我所拥有的:

[{'WWW': '1.1.1.1', 'Dom': '1.1.1.1', 'SPF': None, 'MX': '1.1.1.1', 'PTR': 'reverse.dom.com'}, 
 {'WWW': '1.1.1.1', 'Dom': '1.1.1.1', 'SPF': None, 'MX': '1.1.1.1', 'PTR': 'reverse.dom.com'}, 
 {'WWW': '2.2.2.2', 'Dom': '2.2.2.2', 'SPF': None, 'MX': '2.2.2.2', 'PTR': 'reverse.dom.com'}, 
 {'WWW': '1.1.1.1', 'Dom': '1.1.1.1', 'SPF': None, 'MX': '1.1.1.1', 'PTR': 'reverse.dom.com'}]
但我需要从那条格言中摘录,就像:

list 2: [('WWW', '2.2.2.2'), ('Dom', '2.2.2.2'), ('MX', '2.2.2.2')]
只是所有格言之间的差异。仅针对上下文,这是因为我需要知道多个DNS区域之间是否存在未命中配置


那么,我该怎么做呢?

假设所有字典值都是可散列的,请使用
itertools.chain
和:

结果:

>>> unique
[('WWW', '2.2.2.2'), ('MX', '2.2.2.2'), ('Dom', '2.2.2.2')]
然后获取列表的索引(在本例中,
idx
将是
2
):


感谢您的快速回复!这几乎就是我需要的。但是,如果我有一点改变:
data=[{'WWW':'1.1.1.1','Dom':'1.1.1','SPF':无,'MX':'1.1.1','PTR':'reverse.Dom.com',{'WWW':'2.2.2.2','Dom':'2.2.2','SPF':无,'MX':'2.2.2','PTR':'reverse.Dom.com},{'WWW':'1.1.1.1','Dom':'1.1.1','SPF':None,'MX':'1.1.1.1','PTR':'reversee222.Dom.com'}]
就像只更改一个不同dict的一个值一样,这应该会让我:
dict 2:[(…)]dict 3:[(…)]
这个问题的根本原因是什么?你想做什么?我有一个域列表,所以我需要获得关于多个dns(本地和外部,如Google和OpenDNS)的mx、a、ptr、spf的dns信息然后搜索差异。因此,我构建了一个脚本来查询我想要的所有DNS,并将其放入上面的字典中,但现在我需要比较所有DNS并找出不同之处。我还需要列表索引,因为这将说明差异是否在DNS 1、2或3中…@user2217329——你确定只有一个字典会不同吗?如果
lst[0]
有一个不同的
WWW
但是
lst[2]
有一个不同的
Dom
?很好!然后我需要显示这两个,比如:(0,'WWW','5.1.1.1')和(2,'Dom',2.2.2'))。如果你的列表中有一半是针对
WWW
的,而另一半是针对其他内容呢?哪一个是对的?没有对错之分。如果所有列表都有差异,那么应该显示所有差异,以便我可以修复DNS错误配置。最好的场景是没有差异,因为我需要在同一配置上运行本地和外部DNS我承认,但有些情况是不正确的。
from collections import Counter

data = [{'WWW': '1.1.1.1', 'Dom': '1.1.1.1', 'SPF': None, 'MX': '1.1.1.1', 'PTR': 'reverse.dom.com'}, 
        {'WWW': '1.1.1.1', 'Dom': '1.1.1.1', 'SPF': None, 'MX': '1.1.1.1', 'PTR': 'reverse.dom.com'}, 
        {'WWW': '2.2.2.2', 'Dom': '2.2.2.2', 'SPF': None, 'MX': '2.2.2.2', 'PTR': 'reverse.dom.com'}, 
        {'WWW': '1.1.1.1', 'Dom': '1.1.1.1', 'SPF': None, 'MX': '1.1.1.1', 'PTR': 'reverse.dom.com'}]

unique = [key for key, cnt in
              Counter(p for d in data for p in d.items()).items() if cnt == 1]
>>> unique
[('WWW', '2.2.2.2'), ('MX', '2.2.2.2'), ('Dom', '2.2.2.2')]
idx = next(i for i, d in enumerate(data) if d.get(unique[0][0]) == unique[0][1])