안녕하세요. 이번 시간에는 파이썬의 dictionary에서 key를 remove 하는 방법을 알아보겠습니다.

 


 먼저, dic.pop("1")은 키 "1"을 제거합니다. 1 ~ 5번째 줄에 키 "1", "2", "3"을 넣은 딕셔너리가 선언되었는데요. 이 딕셔너리에서, 키 값 "1"을 가지는 것을 제거하였습니다.

 

 

 결과는 요래 나옵니다. "1" 이라는 키가 없습니다. 참 쉽죠?

 

 

 그러면, "5"를 제거하려고 하면 어떨까요? "5"는 키 값에 들어있지 않습니다. 정상적으로 수행이 될까요?

 

 

 KeyError가 떨어집니다. "5"가 없기 때문에 그런 겁니다. 의외로 딕셔너리를 다루다 보면, KeyError를 꽤 많이 보는데요. 원소를 제거할 때, 키가 없으면 어떻게 처리하면 좋을까요?

 


 pop 함수의 2번째 인자에 None을 넣습니다. 이는 키가 없을 때, KeyError를 떨어트리는 대신 None을 리턴합니다.

 

 결과는 어떻게 나올까요? "5"가 제거되지 않았으니, 딕셔너리에서 키가 제거되는 작업이 수행되지 않았습니다. 고로, "1", "2", "3" 이라는 key값이 남아 있습니다.

 


 키 값 여러 개를 한꺼번에 제거하려고 합니다. 어떻게 하면 좋을까요? 사실 여러 방법이 있습니다만, 리스트 컴프리헨션 용법을 쓰면 매우 손쉽게 할 수 있습니다.

 

 먼저, dic.items()를 순회하면 모든 key, value 쌍을 얻어올 수 있습니다. 한 번 써 볼까요? 6번째 줄에 lt는 dic.items()라고 되어 있습니다. 그리고 이터레이션 lt를 돌면서, items를 뽑아오는데요.

 

 items에는 ("1", 1), ("2", 2), ("3", 3)이 있습니다. 결국 items는 키와 벨류 쌍을 한꺼번에 얻어오는 거라 할 수 있습니다. 이를 이용하면, 제거해야 할 키들을 filtering 조건으로 걸어버리면 되지 않을까? 라는 나름 합리적인 생각을 해 볼 수가 있습니다. 그렇게 해 볼까요? "2"와 "3"을 제거하려고 합니다.

 

 8번째 줄의 k not in {"2", "3"}을 보세요. 키 값이 {"2", "3"}이라는 set에 속하지 않으면 리스트에 넣겠다는 의미입니다. 결국, "2"와 "3"을 제거하는 것과 동일합니다. 그런데, ["2", "3"]이라고는 왜 쓰지 않았을까요? ["2", "3"] 은 리스트입니다. 리스트에서 특정한 값을 찾는 것은 매우 느립니다. 제거해야 할 대상이 매우 많다면 비효율적입니다. {"2", "3"}은 셋입니다. hash 기반이기 때문에 리스트보다는 훨씬 빠르게 not in 절을 검사할 수 있습니다.

 

 

 결과는 위와 같습니다.