키가 겹치는 두개의 dict를 합치는 방법

두개의 dict를 합칠 때 겹치는 key가 있으면 그 key에 대응하는 값을 더해주고 싶습니다.

예를 들어 다음 A, B가 있다고 할 때 Dict A: {'a':1, 'b':2, 'c':3} Dict B: {'b':3, 'c':4, 'd':5}

두개의 dict를 합쳐서 {'a':1, 'b':5, 'c':7, 'd':5} 같은 결과를 내는 함수가 필요합니다.

어떤 게 가장 파이썬스러운 방법일까요?

1답변

  • 좋아요

    0

    싫어요
    채택취소하기

    1. collections.Counter를 쓰는 방법 - dict의 value가 숫자인 경우

    [collections.Counter]는 dict의 하위 클래스로, keykey의 count값을 key-value 쌍으로 저장해 줍니다. *다만, dictvalue가 숫자인 경우만 쓸 수 있습니다.

    from collections import Counter
    A = Counter({'a':1, 'b':2, 'c':3})
    B = Counter({'b':3, 'c':4, 'd':5})
    print(A + B)
    

    결과 : Counter({'c': 7, 'b': 5, 'd': 5, 'a': 1})

    2. 1보다 좀 더 범용(dict의 value가 숫자가 아닌 경우)적인 방법(2.x에서만)

    • int 외에도 스트링 등을 이어 붙이는 방법
    a = {'a': 'foo', 'b':'bar', 'c': 'baz'}
    b = {'a': 'spam', 'c':'ham', 'x': 'blah'}
    
    r = dict(a.items() + b.items() +
        [(k, a[k] + b[k]) for k in set(b) & set(a)])
    
    • 덧셈, 곱셈, 나눗셈 등의 연산을 지원하는 방법
    import operator
    def combine_dicts(a, b, op=operator.add):#덧셈(add), 곱셈(mul), 나눗셈(div)등의 연산을 지원
        return dict(a.items() + b.items() +
            [(k, op(a[k], b[k])) for k in set(b) & set(a)])
    
    a = {'a': 'foo', 'b':'bar', 'c': 'baz'}
    b = {'a': 'spam', 'c':'ham', 'x': 'blah'}
    print(combine_dicts(a,b))
    

    결과 : {'a': 'foospam', 'x': 'blah', 'c': 'bazham', 'b': 'bar'}

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.