[python] 키가 특정 문자열을 포함하는 파이썬 사전에서 항목 필터링

저는 파이썬으로 무언가를 개발하는 C 코더입니다. 나는 C에서 다음을 수행하는 방법을 알고 있지만 (따라서 파이썬에 적용된 C와 유사한 논리로) 그것을 수행하는 ‘Python’방식이 무엇인지 궁금합니다.

사전 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

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

내 사전이 중첩되지 않고 Python 2.7을 사용하고 있습니다.



답변

방법에 대한 DICT 이해 :

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

보시다시피 영어처럼 잘 읽히기 때문에 자명해야합니다.

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

단지 파이썬 3에서가 dict.items()아니라 iteritems()당신이 사용하는 것입니다 그래서 :

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


답변

가장 읽기 쉽고 유지 관리가 쉬운 것을 선택하십시오. 한 줄로 적을 수 있다고해서 그렇게해야한다는 의미는 아닙니다. 기존 솔루션은 값 조회를 건너 뛰기 위해 iteritems를 사용하는 것 외에 내가 사용하는 것과 비슷하며 피할 수 있다면 중첩 된 ifs를 싫어합니다.

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

그러나 필터링 된 dict를 반복 할 수있는 무언가를 정말로 원한다면 필터링 된 dict를 빌드하고 반복하는 두 단계 프로세스를 수행하지 않고 대신 생성기를 사용합니다. 발전기?

먼저 제너레이터를 만들고, 좋은 디자인은 재사용 할 수있을만큼 충분히 추상화해야합니다.

# 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

간단히 말해서, 발전기는 굉장합니다.


답변

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

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

장점은 다른 데이터 구조에 사용할 수 있다는 것입니다.


답변

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


답변

Jonathon은 그의 대답 에서 dict 이해를 사용하는 접근 방식을 제공 했습니다 . 다음은 무언가를하는 부분 을 다루는 접근 방식입니다 .

사전 값으로 무언가를하고 싶다면 사전 이해력이 전혀 필요하지 않습니다.

iteritems(질문에 태그를 지정 했으므로)를 사용 하고 있습니다.

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

이제 결과는 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]


답변