파이썬에서 딕셔너리(dictionary)를 다루다 보면 특정 조건에 맞는 키만 골라내야 하는 경우가 종종 발생합니다. 예를 들어 전체 데이터 중에서 필요한 항목만 추출하거나, 불필요한 키를 제거한 새로운 결과를 만들어야 할 때가 그렇습니다. 이 글에서는 파이썬 딕셔너리에서 원하는 키를 필터링하는 대표적인 두 가지 방법을 예제 코드와 함께 살펴보겠습니다.
1. for 문과 in 연산자 활용
가장 직관적인 방법은 필터링할 키들을 리스트에 담아두고, 리스트의 각 요소를 순회하면서 해당 키가 딕셔너리에 존재하는지 확인하는 것입니다. 존재하는 키에 한해서만 값을 추출하여 최종 결과를 만들게 됩니다.
예제 코드
dictA = {'Mon':'Phy','Tue':'chem','Wed':'Math','Thu':'Bio'}
key_list = ['Tue','Thu']
print("Given Dictionary:\n",dictA)
print("Keys for filter:\n",key_list)
res = [dictA[i] for i in key_list if i in dictA]
print("Filtered result:\n",res)실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Given Dictionary:
{'Mon': 'Phy', 'Tue': 'chem', 'Wed': 'Math', 'Thu': 'Bio'}
Keys for filter:
['Tue', 'Thu']
Filtered result:
['chem', 'Bio']리스트 컴프리헨션(list comprehension) 안에서 if i in dictA 조건을 사용했기 때문에, key_list에 존재하지 않는 키가 포함되어 있어도 KeyError 없이 안전하게 처리됩니다.
2. 집합 교집합(intersection) 활용
두 번째 방법은 집합(set)의 교집합을 이용하는 것입니다. 딕셔너리와 키 리스트 사이의 공통 요소를 찾은 뒤, set() 함수로 중복 없는 요소를 구하고 그 결과를 리스트로 변환하여 값을 추출합니다.
예제 코드
dictA = {'Mon':'Phy','Tue':'chem','Wed':'Math','Thu':'Bio'}
key_list = ['Tue','Thu']
print("Given Dictionary:\n",dictA)
print("Keys for filter:\n",key_list)
temp = list(set(key_list).intersection(dictA))
res = [dictA[i] for i in temp]
print("Filtered result:\n",res)실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Given Dictionary:
{'Mon': 'Phy', 'Tue': 'chem', 'Wed': 'Math', 'Thu': 'Bio'}
Keys for filter:
['Tue', 'Thu']
Filtered result:
['chem', 'Bio']단, 집합은 순서를 보장하지 않기 때문에 결과 리스트의 요소 순서가 입력 순서와 다를 수 있다는 점에 유의해야 합니다. 순서가 중요하다면 첫 번째 방법을 사용하는 것이 좋습니다.
3. 딕셔너리 컴프리헨션으로 키-값 쌍 유지하기
앞선 두 방법은 값(value)만 리스트로 추출합니다. 만약 필터링된 결과도 딕셔너리 형태로 유지하고 싶다면 딕셔너리 컴프리헨션을 활용하면 됩니다.
예제 코드
dictA = {'Mon':'Phy','Tue':'chem','Wed':'Math','Thu':'Bio'}
key_list = ['Tue','Thu']
res = {k: v for k, v in dictA.items() if k in key_list}
print(res) # {'Tue': 'chem', 'Thu': 'Bio'}이 방식은 원본 딕셔너리의 순서와 키-값 구조를 그대로 유지하면서 필요한 항목만 남길 수 있어 실무에서 가장 널리 사용됩니다.
마무리
파이썬 딕셔너리의 키 필터링은 상황에 따라 적절한 방법을 선택하면 됩니다. 간단한 값 추출에는 리스트 컴프리헨션, 대량의 키 비교에는 집합 교집합, 키-값 쌍을 유지해야 한다면 딕셔너리 컴프리헨션을 활용하는 것이 효율적입니다.