27.4 딕셔너리 표현식 사용하기

리스트와 마찬가지로 딕셔너리도 for 반복문과 if 조건문을 사용하여 딕셔너리를 생성할 수 있습니다. 다음과 같이 딕셔너리 안에 키와 값, for 반복문을 지정하면 됩니다.

  • {키: 값 for 키, 값 in 딕셔너리}
  • dict({키: 값 for 키, 값 in 딕셔너리})
>>> keys = ['a', 'b', 'c', 'd']
>>> x = {key: value for key, value in dict.fromkeys(keys).items()}
>>>x
{'a': None, 'b': None, 'c': None, 'd': None}

딕셔너리 표현식을 사용할 때는 for in 다음에 딕셔너리를 지정하고 items를 사용합니다. 그리고 키, 값을 가져온 뒤에는 키: 값 형식으로 변수나 값을 배치하여 딕셔너리를 생성하면 됩니다.

x = {key: value for key, value in dict.fromkeys(keys).items()}

즉, dict.fromkeys(keys).items()로 키-값 쌍을 구한 뒤 키는 변수 key, 값은 변수 value에 꺼내고 최종적으로 keyvalue를 이용하여 딕셔너리를 만듭니다.

그림 27-1 딕셔너리 표현식의 동작 순서
그림 27 1 딕셔너리 표현식의 동작 순서

물론 다음과 같이 keys로 키만 가져온 뒤 특정 값을 넣거나, values로 값을 가져온 뒤 값을 키로 사용할 수도 있습니다. 또는, 키와 값의 자리를 바꾸는 등 여러 가지로 응용할 수 있습니다.

>>> {key: 0 for key in dict.fromkeys(['a', 'b', 'c', 'd']).keys()}>               # 키만 가져옴
{'a': 0, 'b': 0, 'c': 0, 'd': 0}
>>> {value: 0 for value in {'a': 10, 'b': 20, 'c': 30, 'd': 40}.values()}        # 값을 키로 사용
{10: 0, 20: 0, 30: 0, 40: 0}
>>> {value: key for key, value in {'a': 10, 'b': 20, 'c': 30, 'd': 40}.items()}  # 키-값 자리를 바꿈
{10: 'a', 20: 'b', 30: 'c', 40: 'd'}

그런데 딕셔너리 표현식을 사용해보면 복잡하기만 하고 dict.fromkeys 함수만 사용한 결과와 큰 차이점이 없습니다. 대신 딕셔너리 표현식은 딕셔너리에서 특정 값을 찾아서 삭제할 때 유용합니다.

딕셔너리는 특정 키를 삭제하는 메서드만 제공할 뿐 특정 값을 삭제하는 메서드는 제공하지 않습니다. 그러면 특정 값을 찾아서 키-값 쌍을 삭제하려면 어떻게 해야 할까요? 간단하게 for 반복문으로 반복하면서 del로 삭제하는 방식을 떠올릴 수 있습니다.

dict_del_by_value_error.py

x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
 
for key, value in x.items():
    if value == 20:    # 값이 20이면
        del x[key]     # 키-값 쌍 삭제
 
print(x)

실행 결과

Traceback (most recent call last):
  File "C:₩project₩dict_del_by_value_error.py", line 3, in <module>
    for key, value in x.items():
RuntimeError: dictionary changed size during iteration

별 문제 없이 잘 삭제될 것 같지만 반복 도중에 딕셔너리의 크기가 바뀌었다는 에러가 발생합니다. 즉, 딕셔너리는 for 반복문으로 반복하면서 키-값 쌍을 삭제하면 안 됩니다.

이때는 딕셔너리 표현식에서 if 조건문을 사용하여 삭제할 값을 제외하면 됩니다.

  • {키: 값 for 키, 값 in 딕셔너리 if 조건식}
  • dict({키: 값 for 키, 값 in 딕셔너리 if 조건식})
>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> x = {key: value for key, value in x.items() if value != 20}
>>> x
{'a': 10, 'c': 30, 'd': 40}

딕셔너리 표현식에서 if value != 20과 같이 if 조건문을 지정하여 값이 20이 아닌 키-값 쌍으로 다시 딕셔너리를 만들면 됩니다. 직접 키-값 쌍을 삭제하는 방식이 아니라 삭제할 키-값 쌍을 제외하고 남은 키-값 쌍으로 딕셔너리를 새로 만드는 것이죠.

그림 27-2 딕셔너리 표현식에서 if 조건문 사용하기
그림 27 2 딕셔너리 표현식에서 if 조건문 사용하기