키 값을 기반으로 하는 사전의 python 필터 목록
사전 목록이 있고 각 사전에는 다음 값을 가질 수 있는 (예를 들어) '유형' 키가 있습니다.'type1'
,'type2'
등. 제 목표는 이 사전들을 동일한 사전 목록으로 필터링하고 특정 "유형"의 사전만 필터링하는 것입니다.제 생각에 저는 정말 힘든 것 같아요.list/dictionary
이해력
예제 목록은 다음과 같습니다.
exampleSet = [{'type':'type1'},{'type':'type2'},{'type':'type2'}, {'type':'type3'}]
저는 주요 가치들의 목록을 가지고 있습니다.예를 들어 다음과 같이 말하겠습니다.
keyValList = ['type2','type3']
예상 결과 목록은 다음과 같습니다.
expectedResult = [{'type':'type2'},{'type':'type2'},{'type':'type3'}]
루프를 위한 세트로 할 수 있다는 것을 압니다.하지만 더 간단한 방법이 있어야 한다는 것을 알고 있습니다. 저는 이 질문의 많은 다른 맛을 찾았지만, 실제로 그 제안에 맞는 것과 질문에 대한 답은 없었습니다.나는 그 대답에 시도를 게시할 것입니다...하지만 그렇게 인상적이지는 않았어요. 아마 끝을 열어두는 게 좋을 거예요.어떤 도움이라도 주시면 대단히 감사하겠습니다.
리스트 컴포트를 사용해 보세요.
>>> exampleSet = [{'type':'type1'},{'type':'type2'},{'type':'type2'}, {'type':'type3'}]
>>> keyValList = ['type2','type3']
>>> expectedResult = [d for d in exampleSet if d['type'] in keyValList]
>>> expectedResult
[{'type': 'type2'}, {'type': 'type2'}, {'type': 'type3'}]
또 다른 방법은 사용하는 것입니다.
>>> list(filter(lambda d: d['type'] in keyValList, exampleSet))
[{'type': 'type2'}, {'type': 'type2'}, {'type': 'type3'}]
저는 이 게시물에서 몇 가지 답변을 시도하면서 각 답변의 성능을 테스트했습니다.
제가 처음 추측한 것처럼, 목록 이해가 훨씬 빠릅니다.filter
그리고.list
방법은 두 번째이며pandas
3위입니다. 단연코.
정의된 변수:
import pandas as pd
exampleSet = [{'type': 'type' + str(number)} for number in range(0, 1_000_000)]
keyValList = ['type21', 'type950000']
첫 번째 -list comprehension
%%timeit
expectedResult = [d for d in exampleSet if d['type'] in keyValList]
루프당 60.7 ms ± 188 µs(θ ± 표준).dev. 7회 주행, 각 10회 루프)
두 번째 -filter
그리고.list
%%timeit
expectedResult = list(filter(lambda d: d['type'] in keyValList, exampleSet))
루프당 94 ms ± 328 µs(194 ± 표준시).dev. 7회 주행, 각 10회 루프)
세 번째 -pandas
%%timeit
df = pd.DataFrame(exampleSet)
expectedResult = df[df['type'].isin(keyValList)].to_dict('records')
336 ms ± 1.84 ms/루프(1987 ± 표준).dev. 7회 주행, 각 루프 1회)
참고로, 사용pandas
을 처리하기 위해dict
그 이후로 좋은 생각은 아닙니다.pandas.DataFrame
기본적으로 더 많은 메모리를 소비합니다.dict
데이터 프레임을 사용하지 않을 경우 비효율적일 뿐입니다.
사용하다filter
또는 사전의 수가exampleSet
너무 높음, 사용ifilter
의itertools
모듈.시스템 메모리를 한 번에 전체 목록으로 채우는 대신 반복기를 반환합니다.
from itertools import ifilter
for elem in ifilter(lambda x: x['type'] in keyValList, exampleSet):
print elem
에 대한 보편적 접근법filter the list of dictionaries based on key-value pairs
def get_dic_filter_func(**kwargs):
"""Func to be used for map/filter function,
returned func will take dict values from kwargs keys and compare resulted dict with kwargs"""
def func(dic):
dic_to_compare = {k: v for k, v in dic.items() if k in kwargs}
return dic_to_compare == kwargs
return func
def filter_list_of_dicts(list_of_dicts, **kwargs):
"""Filter list of dicts with key/value pairs
in result will be added only dicts which has same key/value pairs as in kwargs """
filter_func = get_dic_filter_func(**kwargs)
return list(filter(filter_func, list_of_dicts))
테스트 사례 / 사용 방법
def test_filter_list_of_dicts(self):
dic1 = {'a': '1', 'b': 2}
dic2 = {'a': 1, 'b': 3}
dic3 = {'a': 2, 'b': 3}
the_list = [dic1, dic2, dic3]
self.assertEqual([], filter_list_of_dicts(the_list, x=1))
self.assertEqual([dic1], filter_list_of_dicts(the_list, a='1'))
self.assertEqual([dic2], filter_list_of_dicts(the_list, a=1))
self.assertEqual([dic2, dic3], filter_list_of_dicts(the_list, b=3))
언급URL : https://stackoverflow.com/questions/29051573/python-filter-list-of-dictionaries-based-on-key-value
'programing' 카테고리의 다른 글
왜 악의적인 사이트는 공격하기 전에 GET를 통해 CSRF 토큰을 얻을 수 없습니까? (0) | 2023.09.04 |
---|---|
MariaDB 타임스탬프가 업데이트 날짜가 아닙니다. (0) | 2023.09.04 |
SQL 데이터베이스에서 칠레산 RUT 확인 (0) | 2023.08.30 |
Ajax와 Symfony2를 통합하는 방법 (0) | 2023.08.30 |
Powershell 내에서 폴더를 여는 방법 (0) | 2023.08.30 |