[파이썬] 딕셔너리 합치기(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