개요
2022.10.06 - [Python] Dictionary 배열에서 조건에 맞는 원소 찾기 - 1에서 조건 하나와 일치하는 Dictionary를 찾아보았는데, 이번에는 다중 조건을 고려해보려고 한다.
능력이 부족한 탓에 stackoverflow에 등록된 소스를 정리해둔다.
다중 조건 고려 - 최소 1개 조건 일치
Dictionary List에서 다중 조건을 고려하여 요소를 찾는 함수는 아래와 같다. 주석으로 코드의 내용을 적어두었다.
# input : dictionary list, 조건(key=value)
# output : dictionary
def find_dict(objects, **kwargs):
return next((
# list 탐색
obj for obj in objects
# 배열 내 Dictionary key와 조건의 key에 대한 교집합 존재 여부 확인
if len(set(obj.keys()).intersection(kwargs.keys())) > 0
# 조건의 모든 key-value 중 key가 Dictionary에 존재하는 것에 대해 그 각각의 value가 동일한지 확인
and all([obj[k] == v for k, v in kwargs.items() if k in obj.keys()])),
# 기본값
None)
함수는 다음과 같이 사용할 수 있다.
dictionaries = [
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5},
{"name": "Pam", "age": 7}
]
print(find_dict(dictionaries, name='Pam', age=7))
print(find_dict(dictionaries, name='Tom', age=7))
다만 all 함수 내 조건절에 의해 key에 오타가 나면 오타가 발생한 key는 제외하여 탐색한다.
all([obj[k] == v for k, v in kwargs.items() if k in obj.keys()]))
따라서 아래와 같이 name 키에 오타가 발생한 경우, age 조건만을 고려하여 일치하는 요소를 찾는다.
dictionaries = [
{"name": "Tom", "age": 10, 'sex': 'male'},
{"name": "Mark", "age": 5, 'sex': 'female'},
{"name": "Pam", "age": 7, 'sex': 'female'}
]
print(find_dict(dictionaries, name='Pam', age=7))
print(find_dict(dictionaries, nam='Tom', age=7))
다중 조건 고려 - 반드시 모든 조건 일치
모든 조건을 고려해야 한다면 all 함수 내 조건절을 다음과 같이 변경할 수 있다.
# input : dictionary list, 조건(key=value)
# output : dictionary
def find_dict(objects, **kwargs):
return next((
# list 탐색
obj for obj in objects
# 배열 내 Dictionary key와 조건의 key에 대한 교집합 존재 여부 확인
if len(set(obj.keys()).intersection(kwargs.keys())) > 0
# 조건의 모든 key에 대한 value가 Dictionary의 value와 동일한지 확인
and all([obj.get(k) == v for k, v in kwargs.items()])),
# 기본값
None)
dictionaries = [
{"name": "Tom", "age": 10, 'sex': 'male'},
{"name": "Mark", "age": 5, 'sex': 'female'},
{"name": "Pam", "age": 7, 'sex': 'female'}
]
print(find_dict(dictionaries, name='Pam', age=7))
print(find_dict(dictionaries, nam='Tom', age=7))
다중 조건 고려 - Dictionary 반환
2022.10.06 - [Python] Dictionary 배열에서 조건에 맞는 원소 찾기 - 1 에서와 동일하게 반환하는 기본값을 None이 아니라 조건 부분을 제외한 빈 Dictionary로 하려고 한다.
기존과 마찬가지로 dict.fromkeys 함수로 빈 Dictionary를 생성한다. 그리고 조건이 여럿이므로 반복문을 이용해 key에 대한 value를 업데이트한다.
def find_dict(objects, **kwargs):
default = dict.fromkeys(objects[0].keys())
for k, v in kwargs.items():
default[k] = v
return next((
# list 탐색
obj for obj in objects
# 배열 내 Dictionary key와 조건의 key에 대한 교집합 존재 여부 확인
if len(set(obj.keys()).intersection(kwargs.keys())) > 0
# 조건의 모든 key에 대한 value가 Dictionary의 value와 동일한지 확인
and all([obj.get(k) == v for k, v in kwargs.items()])),
# 기본값
default)
참고 문서
https://stackoverflow.com/questions/8653516/python-list-of-dictionaries-search