딕셔너리의 키와 값을 뒤집을 때 {value: key for key, value in source.items()}만 쓰면, 같은 값에 연결된 원래 키 중 마지막 것만 남습니다. 원래 키를 모두 보존하려면 뒤집은 값 하나에 키 목록을 모으세요. 이 방법도 원래 값이 문자열처럼 딕셔너리의 키로 쓸 수 있는 값이라는 전제가 있습니다.
다음은 설명용 상품 코드입니다. A01과 A03이 모두 "배"를 가리킵니다. 단순 역변환과 원래 키를 모으는 방법을 같은 입력으로 비교합니다.
products = {"A01": "배", "A02": "자두", "A03": "배"}
inverted = {fruit: code for code, fruit in products.items()}
grouped = {}
for code, fruit in products.items():
grouped.setdefault(fruit, []).append(code)
print("단순 역변환", inverted)
print("항목 수", len(products), len(inverted))
print("원래 키 모두", grouped)
단순 역변환 {'배': 'A03', '자두': 'A02'}
항목 수 3 2
원래 키 모두 {'배': ['A01', 'A03'], '자두': ['A02']}
값이 새 키가 되면서 충돌합니다
첫 항목은 새 사전에 "배": "A01"을 넣습니다. 세 번째 항목도 새 키가 "배"이므로, 그 자리에 있던 값을 "A03"으로 바꿉니다. 기존 상품 코드가 사라진 것처럼 보여도 원본 products를 지운 것은 아닙니다. 항목 두 개로 줄어든 것은 새 사전 inverted입니다.
grouped는 새 키를 하나만 두되 그 값에 리스트를 저장합니다. setdefault(fruit, [])는 키가 없으면 빈 리스트를 넣어 반환하고, 이미 있으면 그 키의 기존 리스트를 반환합니다. 이어지는 append(code)가 같은 과일의 목록에 코드를 추가하므로 A01과 A03이 함께 남습니다.
딕셔너리 순회 자체가 낯설다면 items()로 키와 값을 함께 받는 방법을 먼저 볼 수 있습니다. 여기서는 그 쌍을 읽은 뒤, 값별로 원래 키를 모으는 것이 목적입니다.
값이 리스트이면, 역변환 전에 키 조건에 걸립니다
원래 딕셔너리의 값에는 리스트도 들어갈 수 있습니다. 하지만 그 리스트를 새 키로 쓰면 TypeError가 납니다. 또한 새 키의 충돌은 표시 모양만으로 판단하지 않습니다. 1, True, 1.0처럼 서로 같다고 비교되는 값도 같은 키 자리를 사용합니다.
products = {"A01": ["배"]}
try:
print({fruit: code for code, fruit in products.items()})
except TypeError as error:
print(type(error).__name__)
same_values = {"first": 1, "second": True, "third": 1.0}
print({value: key for key, value in same_values.items()})
TypeError
{1: 'third'}
새 키에는 해시 가능한 값이 필요합니다. 문자열과 정수는 가능하지만 리스트와 딕셔너리는 쓸 수 없습니다. 튜플도 안에 해시 불가능한 값이 있으면 키가 되지 못합니다. 리스트를 문자열로 바꿔 오류만 피하는 방식은 서로 다른 입력이 같은 문자열이 되는지까지 따져야 하므로, 자동 해결책으로 삼지 마세요.
한 값에 키 하나가 필요한지, 모두 필요한지 정하세요
값이 유일하다는 조건이 맞거나 마지막 키만 남겨도 된다면 단순 역변환을 쓸 수 있습니다. 모든 원래 키가 필요하면 첫 예제의 목록 묶기가 맞습니다. 값이 유일해야 하는 계약이라면 역변환이 성공한 뒤 len(inverted) != len(products)인지 확인해 충돌을 오류로 처리할 수도 있습니다. 항목 수가 같다는 검사는 새 키를 만들 수 있는 값이라는 조건까지 대신하지는 않습니다.
가상 예제는 Windows의 CPython 3.14.3에서 각 코드 블록을 독립 실행했습니다. 딕셔너리 순서가 언어 차원에서 보장되는 Python 3.7 이상을 기준으로 읽으세요. 충돌 처리와 컴프리헨션은 Python의 딕셔너리 표현식 문서, 키 조건과 setdefault()는 dict 문서에서 확인할 수 있습니다.