딕셔너리는 key-value 데이터를 저장하는데, value 값으로 key 값을 찾는 방법에 대해서 알아보겠습니다.

딕셔너리는 dict[key] 처럼, key 값으로 value를 쉽게 찾을 수 있지만, value로 key를 찾는 함수는 제공하지 않습니다. 이 때문에, 직접 구현해줘야 합니다.

1. for문을 이용한 방법

아래와 같이 for문으로 딕셔너리를 탐색하면서, 특정 value 값을 갖고 있는 아이템을 찾고, 그 아이템의 key를 찾을 수 있습니다.

  • 딕셔너리에서 key는 중복 값이 없지만, value는 중복 값이 있을 수 있어, 특정 value에 대한 key가 1개 이상이 될 수 있음
  • for key, value in dict_obj.items() : 딕셔너리를 key, value로 순회
  • keys_list.append(key) : 특정 value를 갖고 있는 key를 리스트에 저장
def get_keys_by_value(dict_obj, value_to_find):
    keys_list = []
    for key, value in dict_obj.items():
        if value == value_to_find:
            keys_list.append(key)
    return keys_list

my_dict = {'a': 1, 'b': 2, 'c': 2, 'd': 3}
value_to_find = 2
result = get_keys_by_value(my_dict, value_to_find)
print(result)

Output:

['b', 'c']

2. filter()를 이용한 방법

filter(lambda, items)는 key-value 쌍을 갖고 있는 items에 대해서 lambda 함수의 조건을 충족하는 요소들만 찾아서 (key, value) 튜플에 대한 iterator를 리턴합니다.

  • filter의 리턴 값은 iterator이기 때문에, list(iterator)로 리스트로 변환할 수 있음
  • filter(lambda item: item[1] == value_to_find, my_dict.items()) : value(item[1])가 특정 값이면 iterator로 리턴
  • 찾은 값만 iterator로 리턴하기 때문에, 원본 딕셔너리 값은 변경되지 않음
  • 필터의 결과 값은 (key, value) 튜플
my_dict = {'a': 1, 'b': 2, 'c': 2, 'd': 3}
value_to_find = 2

result = list(filter(lambda item: item[1] == value_to_find, my_dict.items()))
print(result)

Output:

[('b', 2), ('c', 2)]

3. 리스트 컴프리헨션을 이용한 방법

for문을 이용하여 직접 value를 비교하여 key를 찾은 것처럼, 리스트 컴프리헨션을 이용하여 동일한 방법으로 구현할 수 있습니다.

def get_keys_by_value(dict_obj, value_to_find):
    return [key for key, value in dict_obj.items() if value == value_to_find]

my_dict = {'a': 1, 'b': 2, 'c': 2, 'd': 3}
value_to_find = 2
result = get_keys_by_value(my_dict, value_to_find)
print(result)

Output:

['b', 'c']