리스트 형태로 저장된 여러 딕셔너리 중에서, 특정 키의 값이 다른 딕셔너리들과 일치하는 항목을 걸러 내야 하는 상황이 종종 있습니다. 이럴 때 집합 컴프리헨션(set comprehension)과 리스트 컴프리헨션(list comprehension)을 함께 사용하면 단 몇 줄의 코드로 깔끔하게 처리할 수 있습니다.
예제 코드
my_dict_1 = [{'Hi': 32, 'there': 32, 'Will': 19},
{'Hi': 19, 'there': 100, 'Will': 13},
{'Hi': 72, 'there': 19, 'Will': 72}]
print('첫 번째 딕셔너리 리스트 :')
print(my_dict_1)
my_dict_2 = [{'Hi': 72, 'Will': 19}, {'Will': 13, 'Hi': 19}]
print('두 번째 딕셔너리 리스트 :')
print(my_dict_2)
K = 'Hi'
print('기준 키 K의 값 :', K)
# 두 번째 리스트에서 키 K의 값들을 추출하여 집합으로 저장
temp = {element[K] for element in my_dict_2}
# 첫 번째 리스트에서 K 값이 temp에 없는 요소만 남김
my_result = [element for element in my_dict_1 if element[K] not in temp]
print('결과 :')
print(my_result)
실행 결과
첫 번째 딕셔너리 리스트 :
[{'Hi': 32, 'there': 32, 'Will': 19}, {'Hi': 19, 'there': 100, 'Will': 13}, {'Hi': 72, 'there': 19, 'Will': 72}]
두 번째 딕셔너리 리스트 :
[{'Hi': 72, 'Will': 19}, {'Will': 13, 'Hi': 19}]
기준 키 K의 값 : Hi
결과 :
[{'Hi': 32, 'there': 32, 'Will': 19}]
코드 설명
딕셔너리 리스트 정의 : 필터링 대상인 my_dict_1과 비교 기준이 되는 my_dict_2, 두 개의 딕셔너리 리스트를 정의하고 콘솔에 출력합니다.
기준 키 지정 : 어떤 키를 기준으로 값을 비교할지 결정하는 변수 K를 정의합니다. 여기서는 'Hi' 키를 사용합니다.
값 추출(집합 컴프리헨션) : my_dict_2를 순회하면서 각 딕셔너리에서 키 K에 해당하는 값을 꺼내 임시 변수 temp에 집합(set) 형태로 저장합니다.
필터링(리스트 컴프리헨션) : my_dict_1을 순회하면서 각 요소의 K 값이 temp에 포함되어 있지 않은(
not in) 항목만 골라 새로운 리스트를 생성합니다.결과 출력 : 필터링된 결과가 my_result 변수에 할당되고 콘솔에 출력됩니다. 위 예제에서는 'Hi' 키의 값이 72 또는 19인 딕셔너리가 모두 제거되어 하나의 요소만 남게 됩니다.
왜 집합(set)을 사용할까요?
temp를 리스트가 아닌 집합으로 만든 이유는 성능 때문입니다. 집합의 in 연산은 해시 기반으로 동작하여 평균 O(1)의 시간 복잡도를 가지는 반면, 리스트의 in 연산은 처음부터 끝까지 순차적으로 확인해야 하므로 O(n)이 소요됩니다. 따라서 데이터 양이 많아질수록 집합을 활용하는 것이 훨씬 효율적입니다.
참고 사항
이 방식은 원본 리스트(my_dict_1)를 직접 수정하지 않고, 조건에 맞는 요소들로만 구성된 새로운 리스트를 반환합니다. 따라서 원본 데이터를 그대로 유지해야 하는 상황에서도 안전하게 사용할 수 있습니다.