programing

키 값을 기반으로 하는 사전의 python 필터 목록

lastcode 2023. 9. 4. 20:07
반응형

키 값을 기반으로 하는 사전의 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방법은 두 번째이며pandas3위입니다. 단연코.

정의된 변수:

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너무 높음, 사용ifilteritertools모듈.시스템 메모리를 한 번에 전체 목록으로 채우는 대신 반복기를 반환합니다.

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

반응형