HOWTO · Python

Python 사전에서 값으로 키 찾기

이 튜토리얼은 파이썬 사전에서 값으로 키를 얻는 방법을 보여줍니다.

이 페이지의 내용

Python 딕셔너리는 키와 값을 연결하므로, 값으로 키를 찾으려면 딕셔너리 항목을 검색해야 합니다. 각 키-값 쌍을 순회하며 값을 찾으려는 값과 비교하세요. 첫 번째로 일치하는 키가 필요하면 반복문이나 next()를 사용하고, 일치하는 키가 모두 필요하면 리스트 컴프리헨션을 사용하세요. 이러한 검색은 일치 항목을 찾거나 딕셔너리의 모든 항목을 확인할 때까지 진행됩니다.

반복문으로 키-값 쌍 검색하기

dict.items()는 키-값 쌍을 순회할 수 있는 이터러블을 제공합니다. 이를 순회하는 반복문은 값이 찾으려는 값과 같은 첫 번째 키를 반환할 수 있습니다. 반복문이 끝난 뒤 None을 반환하면 일치 항목이 없을 때 호출한 쪽에서 결과를 명확히 처리할 수 있습니다. None도 유효한 키일 수 있다면 별도의 센티널을 사용하거나 (found, key) 쌍을 반환하세요.

다음 예제를 실행해 보세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

def find_key_by_value(dictionary, target):
    for key, value in dictionary.items():
        if value == target:
            return key
    return None

scores = {"Ada": 91, "Lin": 87, "Sam": 91}
print(find_key_by_value(scores, 87))
Lin

일치 항목을 찾으면 반복문이 즉시 반환하므로 딕셔너리 순회 순서에서 처음 만나는 키가 결과가 됩니다. 여러 키의 값이 찾으려는 값과 같더라도 첫 항목을 찾은 뒤에는 나머지 항목을 확인하지 않습니다.

next()로 첫 번째 일치 키 가져오기

제너레이터 표현식을 사용하면 같은 첫 일치 검색을 간결하게 나타낼 수 있습니다. 일치하는 키가 없을 때 StopIteration이 발생하지 않고 None을 반환하도록 기본값과 함께 next()에 전달하세요.

앞 절에서 정의한 scores 사전을 사용하세요. 이 절의 표현식을 평가하기 전에 target을 87로 설정하면 일치 항목을 찾을 수 있습니다. 일치하지 않는 경우를 확인하려면 target을 100으로 바꾸세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

def find_key_with_next(dictionary, target):
    return next((key for key, value in dictionary.items() if value == target), None)

scores = {"Ada": 91, "Lin": 87, "Sam": 91}
print(find_key_with_next(scores, 87))
print(find_key_with_next(scores, 100))

제너레이터는 필요할 때 키를 생성하므로 모든 일치 항목을 담은 리스트를 만들지 않습니다. 값이 일치하지 않으면 기본값을 반환합니다. 데이터에 None을 키로 포함할 수 있다면 유효한 키와 혼동되지 않는 기본값을 선택하세요.

컴프리헨션으로 일치하는 키 모두 모으기

중복된 값도 고려해야 한다면 리스트 컴프리헨션으로 일치하는 키를 모두 모으세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

def find_all_keys(dictionary, target):
    return [key for key, value in dictionary.items() if value == target]

scores = {"Ada": 91, "Lin": 87, "Sam": 91}
print(find_all_keys(scores, 91))
['Ada', 'Sam']

일치하는 값이 없으면 반환 리스트는 비어 있고, 일치하는 값이 있으면 해당 키가 모두 들어갑니다. filter() 표현식으로 일치하는 키-값 쌍을 선택할 수도 있지만, 컴프리헨션은 조건과 결과로 모을 키를 한곳에서 보여 줍니다.

키와 값 리스트의 위치를 맞춰 키 찾기

또 다른 방법은 dict.keys()와 dict.values()를 리스트로 변환하는 것입니다. 두 리스트의 위치는 서로 대응하므로 위치 i의 키는 같은 위치 i의 값에 해당합니다. 값 리스트에서 index()를 호출하면 찾으려는 값이 처음 나타나는 위치를 찾을 수 있습니다. 그 위치를 사용해 키 리스트에서 해당 키를 선택하세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

scores = {"Ada": 91, "Lin": 87, "Sam": 91}
keys = list(scores.keys())
values = list(scores.values())
position = values.index(91)
print(keys[position])
Ada

값이 없으면 index()에서 ValueError가 발생하므로, 값이 없을 수도 있다면 먼저 values에 값이 있는지 확인하거나 예외를 처리하세요. 값이 중복된 경우 index()는 첫 번째 일치 위치만 선택합니다.

중복, 누락된 값, 성능 처리하기

작업에 맞춰 결과 형태를 선택하세요. 반복문이나 next()는 키 하나를 반환하고, 컴프리헨션은 일치하는 키를 모두 리스트로 반환합니다. 첫 일치 항목을 찾는 방법과 index()는 첫 일치 항목에서 멈추므로 결과는 딕셔너리 순회 순서에 따라 달라집니다. 일치하는 값이 없을 때는 None이나 빈 리스트를 결과로 사용할 수 있습니다. 반면 키와 값 리스트를 맞춰 찾는 방법은 값이 리스트에 있는지 확인하거나 예외를 처리하지 않으면 ValueError를 발생시킵니다.

이러한 방법은 최악의 경우 딕셔너리의 모든 항목을 살펴볼 수 있으므로 검색 시간은 항목 수에 비례합니다. 반복문과 제너레이터 표현식은 일치 항목을 모아 둘 컬렉션을 만들지 않습니다. 컴프리헨션은 결과 리스트를 만들고, 키와 값 리스트를 맞춰 찾는 방법은 검색 전에 별도의 키 리스트와 값 리스트를 만듭니다. 값으로 키를 반복해서 찾아야 한다면 역방향 매핑을 유지하는 방법을 고려하세요. 단순한 역방향 딕셔너리는 값마다 키 하나만 보관하므로 중복 값이 있을 때 이를 고려해야 합니다. 중첩 딕셔너리에서는 먼저 검색할 단계가 어디인지 정한 다음 해당 딕셔너리에 같은 항목 순회 방식을 적용하세요.