2013-06-13 6 views
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'}] 

하지만, 그 DICT에서 같은 뭔가 추출해야합니다 모든 dicts 사이 그냥 diferences

list 2: [('WWW', '2.2.2.2'), ('Dom', '2.2.2.2'), ('MX', '2.2.2.2')] 

합니다. 컨텍스트에 대한 이유는 여러 DNS 영역간에 구성이 잘못되어 있는지를 알아야하기 때문입니다.

그래서 어떻게 할 수 있습니까?

+0

질문의 근본적인 이유는 무엇입니까? 너 뭐하려고? – rikAtee

+0

도메인 목록이 있으므로 여러 개의 DNS (로컬 및 외부, Google 및 OpenDNS와 같은)에 대한 mx, a, ptr, spf 및 diferences에 대한 DNS 정보를 얻을 필요가 있습니다. 그래서, 원하는 모든 DNS를 쿼리하고 위의 사전에 넣을 스크립트를 작성했지만 지금은 모두 비교하고 다른 것을 찾으십시오. – evenme

답변

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')] 
+0

diff가 DNS 1, 2 또는 3에 속해 있다고 말하기 때문에 목록 인덱스가 필요합니다. – evenme

+0

@ user2217329 - 사전 중 하나만 다를 것입니까? 'lst [0]'이 다른'WWW '를 가지고 있지만'lst [2]'가 다른'Dom'을 가지고 있다면 어떨까요? – mgilson

+0

좋은 지적! 그런 다음 (0, 'WWW', '5.1.1.1')과 (2, 'Dom', 2.2.2.2 ')와 같이 둘 다 표시해야합니다. – evenme

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]) 
+0

답장을 보내 주셔서 감사합니다. 그게 내가 필요한 거의 다. 그러나 약간의 변경이있는 경우 : 'data = [{ 'WWW': '1.1.1.1', '1.1.1.1', 'SPF': 없음, 'MX': '1.1. '2.2.2.2', 'DOM': '2.2.2.2', 'SPF': 없음, 'MX': '2.2', 'PTR': 'reverse.dom.com'} { 'WWW': '2.2.2.2' 'DOM': '1.1.1.1', 'SPF': 없음 'MX': '' '' '' '' '' '' '' '' ' 1.1.1.1 ","PTR " 'reverse222.dom.com'}]'변화 등 하나만 상이한 딕셔너리들 중 하나의 값은,이 날 가야 : '딕셔너리 2 : (...) ] dict 3 : [(...)]' – evenme