25.3 딕셔너리 표현식 사용하기
리스트와 마찬가지로 딕셔너리도 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에 꺼내고 최종적으로 key와 value를 이용하여 딕셔너리를 만듭니다.
물론 다음과 같이 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'}
25.3.1 딕셔너리 표현식에서 if 조건문 사용하기
그런데 딕셔너리 표현식을 사용해보면 복잡하기만 하고 dict.fromkeys 함수만 사용한 결과와 큰 차이점이 없습니다. 대신 딕셔너리 표현식은 딕셔너리에서 특정 값을 찾아서 삭제할 때 유용합니다.
딕셔너리는 특정 키를 삭제하는 pop 메서드만 제공할 뿐 특정 값을 삭제하는 메서드는 제공하지 않습니다. 그러면 특정 값을 찾아서 키-값 쌍을 삭제하려면 어떻게 해야 할까요? 간단하게 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이 아닌 키-값 쌍으로 다시 딕셔너리를 만듭니다. 직접 키-값 쌍을 삭제하는 방식이 아니라 삭제할 키-값 쌍을 제외하고 남은 키-값 쌍으로 딕셔너리를 새로 만드는 것이죠.