[파이썬] 딕셔너리 합치기(key 같을 때 정리)

반응형
    반응형

    딕셔너리 합치기

    딕셔너리 합치는 방법입니다.
    간단합니다만 딕셔너리 특성상 key 가 같은 경우에는 덮어쓰기가 되니깐 그부분을 잘 조작하면 내가 원하는대로 딕셔너리를 다룰 수 있습니다.

    딕셔너리 합치는 방법

    2개의 딕셔너리를 합치는 방법은 간단합니다. update()라는 함수를 쓰면 됩니다.

    test1 = {'A':1,'B':2,'C':3}
    test2 = {'A':2,'D':4,'E':5}
    
    test1.update(test2)
    print(test1)

    3개 이상일 때도 update를 이용해서 반복하면 됩니다. 한꺼번에 하려면 다음과 같이 합니다.

    dict1 = {'a': 1, 'b': 2}
    dict2 = {'b': 3, 'c': 4}
    dict3 = {'d': 5}
    
    merged_dict = {**dict1, **dict2, **dict3}
    
    print(merged_dict)

    위와 같이 하는 경우 문제는 같은 값은 덮어버리는 것입니다.

    값은 key라면 value를 어떻게 할것인가?

    update()함수를 통해 간단하게 딕셔너리를 합쳤습니다. 하지만 같은 값이면 어떻게 해야할지에 따라 코딩하는 게 달라집니다. if else를 써서 같은 값인 경우를 분별해서 하는일을 다르게 합니다.
    아래 예제는 딕셔너리 key 가 같으면 value의 합을 구하는 예제입니다. 이 프로세스와 비슷하게 가면 됩니다.

    test1 = {'A':1,'B':2,'C':3}
    test2 = {'A':2,'D':4,'E':5}
    
    # 값 겹칠때 value 합치기
    def sum_dict(test1,test2):
        result = {}
        for key,value in test1.items():
            if key in result:
                result[key] += value
            else:
                result[key] = value
    
        for key,value in test2.items():
            if key in result:
                result[key] +=value
            else:
                result[key] = value
        return result
    sum_dict(test1,test2)

    딕셔너리를 따로따로 result에 넣어서 확인하는 방식입니다.

    같은 방식으로 key가 같으면 value 값을 리스트에 넣어보겠습니다.

    # key 값 겹칠 때 value 값 리스트로 만들어서 합치기
    def sum_dict2(test1,test2):
        result = {}
        for key, value in test1.items():
            if key in result:
                if result[key] !=value:
                    result[key] = [result[key],value]
    
            else:
                result[key] = value
        for key, value in test2.items():
            if key in result:
                if result[key] != value:
                    result[key] = [result[key],value]      
            else:
                result[key] = value
        return result
    sum_dict2(test1,test2)

    이렇게 하면 value 값을 모두 보존하면서도 딕셔너리를 만들 수 있게 됩니다.

    3개 이상의 딕셔너리를 합치는 함수 만들기

    위의 함수는 2개인 경우만 가능했습니다. 그렇지만 3개 이상의 딕셔너리도 가능하게 만들려면 asterisk(*) 을 활용합니다.

    def merge_dicts(*dicts):
        merged_dict = {}
    
        for d in dicts:
            for key, value in d.items():
                if key in merged_dict:
                    # 이미 key가 존재하는 경우, 새로운 값으로 업데이트
                    current_value = merged_dict[key]
                    if isinstance(current_value, list):
                        if not value in current_value:
                            current_value.append(value)
                    elif current_value != value:
                        merged_dict[key] = [current_value, value]
                else:
                    # 새로운 key인 경우 값 그대로 추가
                    merged_dict[key] = value
    
        return merged_dict
    
    # 예제 딕셔너리들
    dict1 = {'a': [3, 5], 'b': 2, 'c': 3}
    dict2 = {'b': [2], 'c': 3, 'd': 6}
    dict3 = {'c': 7, 'd': 8, 'e': 9}
    
    # 함수 호출
    result = merge_dicts(dict1, dict2, dict3)
    
    print(result)
    
    
    

    isinstance를 이용해 리스트인지를 확인하고 리스트가 아니면 리스트로 변환후 값을 집어넣습니다.

    마치며

    딕셔너리 합치는 방법에 알아보았습니다. 같은 key 값 value가 다를 때 update()함수를 쓰면 덮어쓰기가 됩니다. 덮어쓰기를 하지 않으려면 자신이 원하는대로 함수를 만들어서 딕셔너리 병합을 마무리하면 되겠습니다.

     

    함께 보면 좋은 글

    [파이썬] 인스턴스 타입 확인하고 넘기기(객체 동적 확인)

    [Pandas] DataFrame을 딕셔너리로 변환

    댓글

    Designed by JB FACTORY

    ....