2012-03-22 3 views
56

dict 두 객체의 결합을 파이썬에서 어떻게 계산합니까? keyin 인 경우 (중복이없는 경우) (key, value) 쌍이 결과에 나타납니다.Python에서 dict 객체의 조합

예를 들어, {'a' : 0, 'b' : 1}{'c' : 2}의 합집합은 {'a' : 0, 'b' : 1, 'c' : 2}입니다.

입력 dict을 수정하지 않고이 작업을 수행 할 수 있습니다. 이것이 유용한 곳의 예 : Get a dict of all variables currently in scope and their values

+2

이 질문은 귀하의 답변에 링크 된 것과 어떤면에서 다른가요? –

+1

@RikPoggi : 다른 질문은 제목에도 불구하고'** d2' * 구문 *이 무엇인지 묻습니다. 이 질문에 대한 대답을 제공합니다. –

답변

55

This question은 관용구를 제공합니다. 당신은 dict() 생성자에 키워드 인수로 dicts 중 하나를 사용

dict(y, **x) 

중복이 x의 값에 찬성 해결; 예를

dict({'a' : 'y[a]'}, **{'a', 'x[a]'}) == {'a' : 'x[a]'} 
+6

"단순함이 복잡한 것보다 낫습니다." :)'dict'의'update' 멤버 함수를 사용해야합니다. – shahjapan

+12

어떻게'tmp = dict (y); tmp.update (x); do_something (tmp)'가 더 간단합니까? –

+6

@shahjapan 이것은 복잡하지는 않습니다. 이것은 Python dict 구조를 잘 사용합니다. 그리고 이것은 업데이트와 다릅니다 (이 솔루션은 아무 것도 업데이트하지 않습니다). – lajarre

53

당신은 독립을 유지하기 위해 모두 dicts이 필요하면 당신은 또한

a = {'a' : 0, 'b' : 1} 
b = {'c' : 2} 

a.update(b) 
print a 
5

같은 딕셔너리의 update 방법을 사용할 수 있으며, 갱신, 당신은 __getitem__ 모두 사전에 조회하는 하나의 개체를 만들 수 있습니다 방법 (그리고 get, __contains__ 및 기타 매핑 방법을 필요에 따라 구현).

미니멀 한 예는 다음과 같이 수 :

class UDict(object): 
    def __init__(self, d1, d2): 
     self.d1, self.d2 = d1, d2 
    def __getitem__(self, item): 
     if item in self.d1: 
      return self.d1[item] 
     return self.d2[item] 

을 그리고 그것은 작동합니다

>>> a = UDict({1:1}, {2:2}) 
>>> a[2] 
2 
>>> a[1] 
1 
>>> a[3] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 7, in __getitem__ 
KeyError: 3 
>>> 
18

두 사전

def union2(dict1, dict2): 
    return dict(list(dict1.items()) + list(dict2.items())) 

N 사전

def union(*dicts): 
    return dict(itertools.chain.from_iterable(dct.items() for dct in dicts)) 
+12

또는 더 쉽게 읽을 수있게,'dict (dct.items()의 dicts에 대한 dct에 대한)' – Eric

+0

왜 list()로 변환합니까? 'def union2 (dict1, dict2) :'return dict (dict1.items() + dict2.items())' – kinORnirvana

+1

@kinORnirvana 파이썬 3에서 : a = { 'x': 1}; type (a.items()) =>