파이썬 딕셔너리(dictionary)는 키(key)와 값(value)이 한 쌍을 이루는 자료구조입니다. 보통은 키를 알고 있을 때 값을 조회하지만, 이 글에서는 그 반대로 값을 알고 있을 때 해당하는 키를 찾는 방법을 소개합니다.
방법 1: index()와 values() 활용
딕셔너리의 keys()와 values() 메서드를 리스트로 변환한 뒤, 리스트의 index() 함수로 특정 값의 위치(인덱스)를 찾고, 키 리스트에서 같은 위치에 있는 요소를 꺼내는 방식입니다.
예제
dictA = {"Mon": 3, "Tue": 11, "Wed": 8}
# 키와 값을 각각 리스트로 변환
keys = list(dictA.keys())
vals = list(dictA.values())
print(keys[vals.index(11)])
print(keys[vals.index(8)])
# 한 줄로 작성하기
print(list(dictA.keys())[list(dictA.values()).index(3)])실행 결과
Tue Wed Mon
vals.index(11)은 값 11이 저장된 인덱스를 반환하고, keys 리스트에서 동일한 인덱스의 요소를 가져오기 때문에 해당 값에 대응하는 키가 출력됩니다.
방법 2: items()와 함수 활용
값을 매개변수로 받아 딕셔너리의 모든 항목과 하나씩 비교한 후, 일치하는 값이 있으면 그 키를 반환하는 함수를 직접 정의해서 사용할 수도 있습니다. 일치하는 값이 없으면 "key doesn't exist"라는 메시지를 반환하도록 처리했습니다.
예제
dictA = {"Mon": 3, "Tue": 11, "Wed": 8}
def get_key(val):
for key, value in dictA.items():
if val == value:
return key
return "key doesn't exist"
print(get_key(11))
print(get_key(3))
print(get_key(10))실행 결과
Tue Mon key doesn't exist
참고 사항
두 방법 모두 조건에 맞는 첫 번째 항목만 반환합니다. 따라서 여러 키가 같은 값을 가질 경우 나머지 키는 무시되며, 정확한 결과를 위해서는 딕셔너리의 값이 고유(unique)한 것이 좋습니다. 또한 값으로 키를 자주 조회해야 한다면, {값: 키} 형태로 뒤집힌 딕셔너리를 미리 만들어 두면 조회 성능을 크게 개선할 수 있습니다.