복붙노트

[PYTHON] 키에 특정 문자열이 들어있는 파이썬 사전의 항목 필터링

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을 사용하고 있습니다.

해결법

  1. ==============================

    1.어떻게 독어 독해력에 관하여 :

    어떻게 독어 독해력에 관하여 :

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

    당신은 그것을 보았습니다, 그것은 영어와 같이 꽤 잘 읽는 것처럼, 자명 한 것이어야합니다.

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

    파이썬 3에는 iteritems ()가 아닌 dict.items () 만 있으므로 다음과 같이 사용하십시오 :

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

    2.가독성이 높고 유지 보수가 쉬운 것은 무엇이든 이동하십시오. 단 한 줄로 쓸 수 있다고해서 반드시해야한다는 것은 아닙니다. 당신의 기존 솔루션은 사용자가 iteritems를 사용하여 값 조회를 건너 뛰는 것 외에 다른 것을 사용할 것입니다. 그리고 피할 수 있다면 중첩 된 if를 싫어합니다.

    가독성이 높고 유지 보수가 쉬운 것은 무엇이든 이동하십시오. 단 한 줄로 쓸 수 있다고해서 반드시해야한다는 것은 아닙니다. 당신의 기존 솔루션은 사용자가 iteritems를 사용하여 값 조회를 건너 뛰는 것 외에 다른 것을 사용할 것입니다. 그리고 피할 수 있다면 중첩 된 if를 싫어합니다.

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

    그러나 당신이 realllly 필터링 된 dict를 통해 반복 할 수 있도록 뭔가 원하는 경우 다음 필터링 된 dict 빌드 및 iterating 두 단계 프로세스를 수행하는 대신 생성기를 사용하여, 왜냐하면 더 파이썬 (그리고 끝내주는 무엇보다) 발전기?

    먼저 우리는 생성기를 만들고, 좋은 디자인은 재사용 할 수있을 정도로 추상화하도록 지시합니다.

    # 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
    

    요약하면 발전기는 굉장합니다.

  3. ==============================

    3.

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

    4.Jonathon은 자신의 대답에 dict comprehension을 사용하여 접근 방법을 제시했습니다. 여기 뭔가를 처리하는 접근법이 있습니다.

    Jonathon은 자신의 대답에 dict comprehension을 사용하여 접근 방법을 제시했습니다. 여기 뭔가를 처리하는 접근법이 있습니다.

    사전 값을 사용하여 무언가를하고 싶다면 사전에 이해할 필요가 없습니다.

    나는 당신이 python-2.7로 질문을 태그했기 때문에 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]
    
  5. ==============================

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

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

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

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

  6. from https://stackoverflow.com/questions/23862406/filter-items-in-a-python-dictionary-where-keys-contain-a-specific-string by cc-by-sa and MIT license