1

我需要了解列表中多个字典之间的差异。我有的:

[{'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 区域之间是否存在未命中配置。

那么,我该怎么做呢?

4

2 回答 2

0

Assuming all the dictionary values are hashable, use itertools.chain and collections.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')]
于 2013-06-13T17:17:43.157 回答
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')]

然后获取列表的索引(在这种情况下idx2):

idx = next(i for i, d in enumerate(data) if d.get(unique[0][0]) == unique[0][1])
于 2013-06-13T17:18:50.537 回答