2017-09-19 9 views
2

으로 defaultdict 키 - 값을 비교 :내가 두 <code>defaultdict</code>이 다른 defaultdict

defaultdict(<type 'list'>, {'a': ['OS', 'sys', 'procs'], 'b': ['OS', 'sys']}) 

defaultdict(<type 'list'>, {'a': ['OS', 'sys'], 'b': ['OS']}) 

가 어떻게 각각에서 누락 된 값의 수를 얻기 위해이 두 가지를 비교합니까. 예를 들어, 두 번째 값이 'a' 키의 두 번째 defaultdict에서 누락되고 하나가 누락되어 야합니다. 'b'에서 누락되었습니다.

+0

두 번째 기본 딕트는 항상 첫 번째 defaultdict의 하위 집합으로 보장됩니까? – mgilson

답변

0

방금 ​​두 번째 기본 딕셔너리에서 누락 총 수를 원하는 경우에, 당신은 B.

에 상대적으로 많은 일들이 얼마나 많은 알아 내기 위해 첫 번째 DICT 반복과 차이 집합으로 볼 수 있습니다

는이 같은 dicts을 정의하는 경우 :

a = defaultdict(list, {'a': ['OS', 'sys', 'procs'], 'b': ['OS', 'sys']}) 
b = defaultdict(list, {'a': ['OS', 'sys'], 'b': ['OS']}) 

이 DICT의 B에서 누락 얼마나 많은 당신을 말할 것이다 :

total_missing_inB = 0 
for i in a: 
    diff = set(a[i]) - set(b[i]) 
    total_missing_inB += len(diff) 

그리고 DICT에서 누락 얼마나 많은 이것은

total_missing_inA = 0 
for i in b: 
    diff = set(b[i]) - set(a[i]) 
    total_missing_inA += len(diff) 
+0

@bmcmwnamin 도움을 주셔서 감사합니다.나는 이것을 알아 내기 위해 몇 시간을 낭비했다. 많은 것을 고맙게 생각합니다. – Rob

1

누락 된 요소를 가장 효율적으로 찾아서 계산할 수 있어야합니다. 주의를 기울이면 defaultdict에 항목을 추가하지 않고도 (함수 입력이 defaultdict이라고 가정하지 않고)이 작업을 수행 할 수도 있습니다.

거기에서 그 결과를 사전에 누적하는 것입니다.

def compare_dict_of_list(d1, d2): 
    d = {} 
    for key, value in d1.items(): 
     diff_count = len(set(value).difference(d2.get(key, []))) 
     d[key] = diff_count 
    return d 
+0

안녕하세요, 귀하의 commecnt 주셔서 감사합니다. 그러나 우리는 dictionarydict에 대해 len을 사용할 수 없습니다. (TypeError : unhashable type : 'list') – Rob

+0

@Rob - 죄송합니다. 오타였습니다. 'd2.get (key, [])) '이어야합니다. – mgilson

0

가 여기에 우리가 값을 추적하는 collections.Counter를 사용하여 다른 솔루션을 제공, 우리는 드문 키와 값에 관한 일부 가장자리의 경우를 고려 당신을 말할 것이다. 키가 모두 말씨 동일하지 않은 경우

코드

import collections as ct 


def compare_missing(d1, d2, verbose=False): 
    """Return the count of missing values from dict 2 compared to dict 1.""" 
    record = {} 
    for k in d1.keys() & d2.keys(): 
     a, b = ct.Counter(d1[k]), ct.Counter(d2[k]) 
     record[k] = a - b 
    if verbose: print(record) 
    return sum(v for c in record.values() for v in c.values()) 

데모

dd0 = ct.defaultdict(list, {"a": ["OS", "sys", "procs"], "b": ["OS", "sys"]}) 
dd1 = ct.defaultdict(list, {"a": ["OS", "sys"], "b": ["OS"]}) 

compare_missing(dd0, dd1, True) 
# {'a': Counter({'procs': 1}), 'b': Counter({'sys': 1})} 
# 2 

compare_missing(dd1, dd0, True) 
# {'a': Counter(), 'b': Counter()} 
# 0 

세부

양자리, compare_missing은 공통 키만 반복합니다. 다음 예에서, 새로운 키 (c가) dd1에 추가에도 불구하고, 우리는 위와 같은 결과를 얻을 : 드문 값이나 복제가 (각각 dd3[b]에서 "admin""OS")를 발견하는 경우

dd2 = ct.defaultdict(list, {"a": ["OS", "sys"], "b": ["OS"], "c": ["OS"]}) 
compare_missing(dd0, dd2) 
# 2 

compare_missing(dd2, dd0) 
# 0 

,이 또한 다음과 같이 계산됩니다.

dd3 = ct.defaultdict(list, {"a": ["OS", "sys"], "b": ["OS", "admin", "OS"]}) 
compare_missing(dd3, dd0, True) 
# {'a': Counter(), 'b': Counter({'OS': 1, 'admin': 1})} 
# 2