2013-11-24 6 views
0

두 개의 사전을 하나의 (새로운) 사전에 넣으려고합니다.하지만 계속 문제가 있습니다.사전 두 개를 하나에 넣으십시오

def combine_report(r1, r2): 
    to_merge=[r1,r2] 
    d={} 
    for m in to_merge: 
     for k,v in m.items(): 
      d.setdefault(k,{}).update(v) 
    return d 
+1

처럼되고이 입력으로 사용하는 사전은 무엇입니까? –

답변

1

당신은 d에 직접 .update()를 사용해야합니다 :

def combine_report(r1, r2): 
    d = r1.copy() 
    d.update(r2) 
    return d 
내 기능에서 R1과 R2를 정의하기 때문에

'NoneType' object is not iterable 

것은 이해가되지 않습니다 :이 오류 메시지가

빈 사전에 키를 설정하려고 시도한 다음 그 값만 가진 사람들에 대해 .update()을 호출했습니다. 이 값은 반복 가능이어야합니다.; 값 잊어 버려 경우 None 그 특정 예외로 이어질 것 :

>>> {}.update(None) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'NoneType' object is not iterable 

버전이 간단한 항목 할당을 사용하여 '수리'할 수있다 : 내 버전에 표시된 것처럼

def combine_report(r1, r2): 
    to_merge = [r1, r2] 
    d={} 
    for m in to_merge: 
     for k, v in m.items(): 
      d[k] = v 
    return d 

을하지만 .update()를 사용하여 더 효율적으로 될 것입니다. 당신은 키 당 목록에 보존 모든 값을 가지고있는 경우

, 다음 사용 k는 기본 값이 아직 존재 세트를하는 경우 여기에

def combine_report(r1, r2): 
    d = {} 
    for m in to_merge: 
     for k, v in m.items(): 
      d.setdefault(k, []).append(v) 
    return d 

dict.setdefault()k에 대한 값을 반환하지만 것 (여기 목록). 당신은 단지 값으로 사전을 업데이트하기 위해 노력하고 있기 때문에 대신

d.setdefault(k,{}).update(v) 

+0

'업데이트'가 사전 이해보다 효율적입니까? – thefourtheye

+0

@thefourtheye : 나는 그렇게 기대한다. C 코드는 기존 사전 구조를 재사용 할 수 있으며 C의 루프는 언제든지 Python의 루프를 이깁니다. –

+0

당신은 comprehensions가 C가 아닌 Python으로 구현된다는 것을 의미합니까? – thefourtheye

0

당신은

d.setdefault(k,[]).append(v) 

으로 가야한다. 실제로 필요한 것은 키에 해당하는 값 목록입니다. 따라서, 전체 프로그램이

def combine_report(r1, r2): 
    to_merge, d = [r1,r2], {} 
    for m in to_merge: 
     for k,v in m.items(): 
      d.setdefault(k,[]).append(v) 
    return d 

print(combine_report({"1":"a"}, {"1":"b"})) 

출력

{'1': ['a', 'b']} 
+0

하나의 키에 대해 동일한 값을 갖고 있어도 결합됩니까? 어떤 값을 대체하고 싶지 않습니다. 하나의 보고서가 { '1': 'a'}이고 다른 보고서가 { '1': 'b'}이면 { '1': 'a', b}} – user2976821

+0

@ user2976821 업데이트 된 답변. 예상대로 작동합니다. – thefourtheye

+0

감사합니다. setdefualt.() 함수는 무엇을합니까? – user2976821

관련 문제