programing

키에 특정 문자열이 포함된 python 사전의 항목 필터링

batch 2023. 8. 19. 09:58
반응형

키에 특정 문자열이 포함된 python 사전의 항목 필터링

저는 파이썬에서 무언가를 개발하고 있는 C 코더입니다.저는 C에서 다음을 수행하는 방법을 알고 있습니다(따라서 파이썬에 적용되는 C와 같은 논리). 하지만 '파이썬' 방식이 무엇인지 궁금합니다.

사전 d가 있고 키(문자열)에 특정 하위 문자열이 포함된 항목만 하위 집합으로 작업하려고 합니다.

즉, C 로직은 다음과 같습니다.

for key in d:
    if filter_string in key:
        # do something
    else
        # do nothing, continue

나는 파이썬 버전이 비슷한 것이라고 생각합니다.

filtered_dict = crazy_python_syntax(d, substring)
for key,value in filtered_dict.iteritems():
    # do something

저는 사전 필터링과 관련하여 여기서 많은 게시물을 찾았지만 정확히 이것과 관련된 게시물은 찾을 수 없었습니다.

내 사전은 중첩되지 않았으며 파이썬 2.7을 사용하고 있습니다.

딕트 이해력은 어떻습니까?

filtered_dict = {k:v for k,v in d.iteritems() if filter_string in k}

여러분이 보시는 것처럼, 그것은 영어처럼 꽤 잘 읽히기 때문에, 스스로 설명할 수 있어야 합니다.

이 구문에는 Python 2.7 이상이 필요합니다.

Python 3에서, 단지, 그렇지 않습니다.iteritems()따라서 다음을 사용할 수:

filtered_dict = {k:v for (k,v) in d.items() if filter_string in k}

내장 필터 기능을 사용하여 특정 조건에 따라 사전, 목록 등을 필터링할 수 있습니다.

filtered_dict = dict(filter(lambda item: filter_str in item[0], d.items()))

다양한 데이터 구조에 사용할 수 있다는 장점이 있습니다.

가장 읽기 쉽고 쉽게 유지 관리할 수 있는 모든 것을 선택합니다.한 줄로 쓸 수 있다고 해서 그렇게 해야 하는 것은 아닙니다.귀사의 기존 솔루션은 사용자 반복 항목을 사용하여 값 조회를 건너뛰는 것 외에는 사용할 수 없는 솔루션에 가까우며, 이러한 문제를 피할 수 있다면 중첩된 경우가 싫습니다.

for key, val in d.iteritems():
    if filter_string not in key:
        continue
    # do something

하지만 만약 당신이 정말로 필터링된 딕트를 통해 반복할 수 있는 무언가를 원한다면, 나는 필터링된 딕트를 만들고 그것을 통해 반복하는 2단계 과정을 하지 않고, 대신 발전기를 사용할 것입니다. 왜냐하면 발전기보다 더 파이썬적이고 멋진 것이 무엇인가요?

먼저 발전기를 만들고, 좋은 디자인은 발전기를 재사용할 수 있을 정도로 추상적으로 만들 것을 지시합니다.

# The implementation of my generator may look vaguely familiar, no?
def filter_dict(d, filter_string):
    for key, val in d.iteritems():
        if filter_string not in key:
            continue
        yield key, val

그런 다음 생성기를 사용하여 간단하고 이해하기 쉬운 코드로 문제를 깔끔하고 깨끗하게 해결할 수 있습니다.

for key, val in filter_dict(d, some_string):
    # do something

간단히 말해서 발전기는 훌륭합니다.

input = {"A":"a", "B":"b", "C":"c"}
output = {k:v for (k,v) in input.items() if key_satifies_condition(k)}

내장된 기능 'filter()'를 사용할 수 있습니다.

data = {'aaa':12, 'bbb':23, 'ccc':8, 'ddd':34}

# filter by key
print(dict(filter(lambda e:e[0]=='bbb', data.items() ) ) )

# filter by value
print(dict(filter(lambda e:e[1]>18, data.items() ) ) )

출력:

{'bbb':23}

{'bbb':23, 'ddd':34}

조나단은 그의 대답에서 받아쓰기 이해를 사용하여 접근법을 제시했습니다.여기 여러분의 행동 부분을 다루는 접근법이 있습니다.

사전의 값으로 작업을 수행하려면 사전 이해가 전혀 필요하지 않습니다.

는 중용사를 합니다.iteritems(7로 질문에 태그를 달았기 때문입니다.

results = map(some_function, [(k,v) for k,v in a_dict.iteritems() if 'foo' in k])

는 이제결다표목시다니됩록에음가과▁▁list다니와 함께 목록에 있을 것입니다.some_function/쌍적용며되에이, 는전의가 있습니다.foo열쇠로

값을 처리하고 키를 무시하려면 목록 이해도를 변경하십시오.

results = map(some_function, [v for k,v in a_dict.iteritems() if 'foo' in k])

some_function이 될 수 람다도합니다.

results = map(lambda x: x*2, [v for k,v in a_dict.iteritems() if 'foo' in k])

내부 목록은 실제로 필요하지 않습니다. 생성기 식을 매핑에 전달할 수도 있습니다.

>>> map(lambda a: a[0]*a[1], ((k,v) for k,v in {2:2, 3:2}.iteritems() if k == 2))
[4]

언급URL : https://stackoverflow.com/questions/23862406/filter-items-in-a-python-dictionary-where-keys-contain-a-specific-string

반응형