파이썬 딕셔너리를 다루다 보면 키는 고유하지만 값은 중복되는 경우를 자주 만나게 됩니다. 예를 들어 여러 요일에 동일한 숫자가 매핑되어 있을 때, 같은 값을 공유하는 모든 키를 한 번에 확인하고 싶을 수 있습니다. 이번 글에서는 이러한 문제를 해결하는 두 가지 방법을 예제 코드와 함께 살펴보겠습니다.
방법 1: 키와 값 교환하기
가장 직관적인 접근 방식은 딕셔너리의 키와 값을 서로 뒤바꾸는 것입니다. 원래의 값을 새로운 키로 삼고, 그 값에 연결된 키들을 리스트에 계속 추가하면 중복된 값들이 자동으로 하나로 묶입니다. 그 결과 새로운 딕셔너리에서 어떤 키들이 같은 값을 공유하는지 한눈에 파악할 수 있습니다.
예제 코드
dictA = {'Sun': 5, 'Mon': 3, 'Tue': 5, 'Wed': 3}
print("Given Dictionary :", dictA)
k_v_exchanged = {}
for key, value in dictA.items():
if value not in k_v_exchanged:
k_v_exchanged[value] = [key]
else:
k_v_exchanged[value].append(key)
# 결과 출력
print("New Dictionary:", k_v_exchanged)실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Given Dictionary : {'Sun': 5, 'Mon': 3, 'Tue': 5, 'Wed': 3}
New Dictionary: {5: ['Sun', 'Tue'], 3: ['Mon', 'Wed']}출력 결과를 보면 값 5에는 'Sun'과 'Tue'가, 값 3에는 'Mon'과 'Wed'가 각각 리스트로 묶여 있음을 확인할 수 있습니다.
방법 2: set과 filter 활용하기
두 번째 방법도 유사한 흐름을 따르지만, setdefault() 메서드와 set 자료형을 활용한다는 점이 다릅니다. 기존 딕셔너리를 순회하면서 각 값을 키로 하는 집합(set)에 원래의 키들을 추가하고, 마지막에는 filter() 함수로 요소 개수가 1보다 큰 항목만 골라내어 중복 여부를 판별합니다.
예제 코드
dictA = {'Sun': 5, 'Mon': 3, 'Tue': 5, 'Wed': 4}
print("Given Dictionary :", dictA)
dictB = {}
for key, value in dictA.items():
dictB.setdefault(value, set()).add(key)
res = filter(lambda x: len(x) > 1, dictB.values())
# 결과 출력
print("New Dictionary:", list(res))실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Given Dictionary : {'Sun': 5, 'Mon': 3, 'Tue': 5, 'Wed': 4}
New Dictionary: [{'Tue', 'Sun'}]이 예제에서는 값 4('Wed')는 중복되지 않았기 때문에 결과에서 제외되고, 값 5를 공유하는 'Sun'과 'Tue'만 필터링되어 출력됩니다.
마무리
키와 값을 교환하는 첫 번째 방법은 결과를 딕셔너리 형태로 깔끔하게 정리해 주고, set과 filter를 조합한 두 번째 방법은 코드가 더 간결하다는 장점이 있습니다. 두 방법 모두 시간 복잡도 측면에서 효율적이므로, 상황과 필요에 맞게 적절한 방법을 선택하여 활용하시기 바랍니다.