查找词典列表之间的差异

时间:2013-06-13 17:11:04

标签: 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.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区域之间是否存在未命中配置。

那么,我该怎么做?

2 个答案:

答案 0 :(得分:0)

假设所有字典值都是可清除的,请使用itertools.chaincollections.Counter

>>> lst = [{'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'}]
>>> c = Counter(chain.from_iterable(d.items() for d in lst))
>>> print([key for key,val in c.items() if val == 1])
[('WWW', '2.2.2.2'), ('MX', '2.2.2.2'), ('Dom', '2.2.2.2')]

答案 1 :(得分:0)

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将是2):

idx = next(i for i, d in enumerate(data) if d.get(unique[0][0]) == unique[0][1])