2013-12-11 4 views
1

나는 Merge dictionaries without overwriting values, merging "several" python dictionaries, How to merge multiple dicts with same key?How to merge two Python dictionaries in a single expression?을 알고 있습니다.값이 목록 인 이전 값을 덮어 쓰지 않고 병합 사전

그러나 내 문제는 약간 다릅니다.

내가 병합 결과가

result_dict = {'a': [3.212, 3.212, 923.22], 'b': [0.0, 0.0], 'c': [123.32]} 
이 코드는 여기서 일하는

을해야

dict_a = {'a': [3.212], 'b': [0.0]} 
dict_b = {'a': [923.22, 3.212], 'c': [123.32]} 
dict_c = {'b': [0.0]} 

이 세 가지 사전을 가지고 있다고 할 수 있지만 목록에서 목록을 중첩 사용 것

result_dict = {} 
dicts = [dict_a, dict_b, dict_c] 

for d in dicts: 
    for k, v in d.iteritems(): 
     result_dict.setdefault(k, []).append(v) 

append 대신 extend을 사용하면 nes ted 목록이지만 키가 아직 존재하지 않으면 작동하지 않습니다. 따라서 기본적으로 다른 스레드와 마찬가지로 덮어 쓰지 않고 update을 수행해야합니다.

죄송합니다. 제 실수는 실수였습니다. 그것은 어제 너무 늦었고 오류를 던진 선이 내가 생각했던 것이 아니란 것을 알아 채지 못했습니다. 따라서 사전에 이미 위의 구조가 있다고 가정했습니다. 실제로 mgilsonTypeError과 관련되어 있다고 가정하면 정확합니다. 정확히 말하자면, '부유 할 수있는 부유물'.

+2

당신이 설명 할 수 있을까요? 'setdefault (k, [])'가 존재하지 않는 핵심 문제를 돌봐야하지 않습니까? – DSM

+1

왜 'a'에 대한 결과 목록이 그 순서대로 끝났습니까? 나는 기대했을 것이다.'[3.212, 923.22, 3.212]' – mgilson

+0

@mgilson 네, 죄송합니다. 나는 이미 내 머리를 정리했다. 그러나 그것은 당신이 말한 방식이어야합니다. – cherrun

답변

3

나는

>>> dict_a = {'a': [3.212], 'b': [0.0]} 
>>> dict_b = {'a': [923.22, 3.212], 'c': [123.32]} 
>>> dict_c = {'b': [0.0]} 
>>> result_dict = {} 
>>> dicts = [dict_a, dict_b, dict_c] 
>>> 
>>> for d in dicts: 
...  for k, v in d.iteritems(): 
...   result_dict.setdefault(k, []).extend(v) 
... 
>>> result_dict 
{'a': [3.212, 923.22, 3.212], 'c': [123.32], 'b': [0.0, 0.0]} 

마법은 dict.setdefault 방법입니다 ... .extend 여기에 작동하는지 확신 해요. 키가 존재하지 않으면 setdefault은 사용자가 제공 한 기본값으로 새 키를 추가합니다. 그런 다음 은 기본값을 수정할 수있는을 반환합니다. 항목 v이 반복 가능하지 않은 경우이 솔루션 문제있을 것이라는 점을


참고. 아마 그것이 당신이 의미 한 것입니까? 예 : dict_a = {'a': [3.212], 'b': 0.0} 인 경우 이 경우

, 나는 당신이 try-except 절에 TypeError: type object is not iterable을 잡기에 의지해야합니다 생각 : extend` 작동하지 않습니다 이유는`

for d in dicts: 
    for k, v in d.iteritems(): 
     try: 
      result_dict.setdefault(k, []).extend(v) 
     except TypeError: 
      result_dict[k].append(v) 
+0

나는'abc'에서 모든 것을 뒤쫓아 다니지 않았습니다. 기본적으로 "스칼라", 즉 "iterable 또는 iterable하지만 문자열"이 있습니까? – DSM

+0

@DSM - 확실하지 않은 질문이 있습니다. 나는 OP의 질문을 얻을 확실하지 않습니다. OP의 샘플 입력 내용은 모두 반복 가능하지만 OP는'.extend'가 어떤 이유에서든 작동하지 않을 것이므로 OP가 시도 했었다고 생각하게 만들었습니다. 그래서, 왜 * .extend가 실패했는지 이유를 파악하기 시작했습니다. 반복 불가능한 항목이 가장 많은 범인 인 것처럼 보였습니다 (다만 추측). – mgilson

+0

TypeError 접근법은 문자열 같은 스칼라 형이지만 반복 가능한 객체가'.extend' 브랜치를 가져 와서 "Fred"를 "F", "r", "e"로 바꾸는 것을 막을뿐입니다. "d". – DSM

관련 문제