복붙노트

[PYTHON] 파이썬 : defaultdict의 defaultdict?

PYTHON

파이썬 : defaultdict의 defaultdict?

다음 코드를 작동 시키려면 defaultdict (defaultdict (int))를 사용하는 방법이 있습니까?

for x in stuff:
    d[x.a][x.b] += x.c_int

d는 x.a 및 x.b 요소에 따라 임시로 구축해야합니다.

나는 다음을 사용할 수있다.

for x in stuff:
    d[x.a,x.b] += x.c_int

하지만 그때 나는 사용할 수 없을 것이다.

d.keys()
d[x.a].keys()

해결법

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

    1.예, 이렇게 :

    예, 이렇게 :

    defaultdict(lambda: defaultdict(int))
    

    defaultdict (이 경우 lambda : defaultdict (int))의 인수는 존재하지 않는 키에 액세스하려고 할 때 호출됩니다. 이것의 반환 값은이 키의 새로운 값으로 설정됩니다. 즉, 우리의 경우 d [Key_doesnt_exist] 값은 defaultdict (int)가됩니다.

    이 마지막 defaultdict에서 키에 액세스하려고하면 d [Key_doesnt_exist] [Key_doesnt_exist]는 마지막 defaultdict 즉 int () 인수의 반환 값인 0을 반환합니다.

  2. ==============================

    2.defaultdict 생성자에 대한 매개 변수는 새 요소를 작성하기 위해 호출되는 함수입니다. 그래서 람다를 사용합시다!

    defaultdict 생성자에 대한 매개 변수는 새 요소를 작성하기 위해 호출되는 함수입니다. 그래서 람다를 사용합시다!

    >>> from collections import defaultdict
    >>> d = defaultdict(lambda : defaultdict(int))
    >>> print d[0]
    defaultdict(<type 'int'>, {})
    >>> print d[0]["x"]
    0
    

    Python 2.7부터 카운터를 사용하는 더 나은 솔루션이 있습니다.

    >>> from collections import Counter
    >>> c = Counter()
    >>> c["goodbye"]+=1
    >>> c["and thank you"]=42
    >>> c["for the fish"]-=5
    >>> c
    Counter({'and thank you': 42, 'goodbye': 1, 'for the fish': -5})
    

    일부 보너스 기능

    >>> c.most_common()[:2]
    [('and thank you', 42), ('goodbye', 1)]
    

    자세한 내용은 PyMOTW - Collections - 컨테이너 데이터 유형 및 Python Documentation - collections를 참조하십시오.

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

    3.부분적으로 사용하는 것이 약간 더 우아합니다.

    부분적으로 사용하는 것이 약간 더 우아합니다.

    import functools
    dd_int = functools.partial(defaultdict, int)
    defaultdict(dd_int)
    

    물론 이것은 람다와 같습니다.

  4. ==============================

    4.다른 사람들은 다음을 올바르게 수행하는 방법에 대한 귀하의 질문에 정확하게 대답했습니다.

    다른 사람들은 다음을 올바르게 수행하는 방법에 대한 귀하의 질문에 정확하게 대답했습니다.

    for x in stuff:
        d[x.a][x.b] += x.c_int
    

    또 다른 방법은 키에 튜플을 사용하는 것입니다.

    d = defaultdict(int)
    for x in stuff:
        d[x.a,x.b] += x.c_int
        # ^^^^^^^ tuple key
    

    이 방법의 좋은 점은 간단하고 쉽게 확장 할 수 있다는 것입니다. 3 단계의 매핑이 필요하다면 키에 3 개의 항목 튜플을 사용하십시오.

  5. from https://stackoverflow.com/questions/5029934/python-defaultdict-of-defaultdict by cc-by-sa and MIT license