我需要在列表中的多个字典之间找到区别。我有什么:
[{'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区域之间是否存在未命中配置。
那么,我该怎么做?
答案 0 :(得分:0)
假设所有字典值都是可清除的,请使用itertools.chain
和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')]
答案 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])