development

사전 항목을 추가하거나 늘리는 방법은 무엇입니까?

big-blog 2020. 12. 27. 20:41
반응형

사전 항목을 추가하거나 늘리는 방법은 무엇입니까?


저는 현재 오랜만에 파이썬에 재 참여하고 사랑하고 있습니다. 그러나 나는 계속해서 패턴을 마주하게된다. 나는 내가 원하는 것을 표현하는 더 좋은 방법이 있어야하고 아마도 그것을 잘못된 방법으로하고있을 것이라고 생각한다.

내가 작성중인 코드는 다음과 같은 형식입니다.

# foo is a dictionary
if foo.has_key(bar):
  foo[bar] += 1
else:
  foo[bar] = 1

나는 내 프로그램에서 이것을 많이 쓰고있다. 나의 첫 번째 반응은 도우미 함수로 밀어내는 것이지만, 너무 자주 파이썬 라이브러리는 이미 이와 같은 것을 제공합니다.

내가 놓친 간단한 구문 트릭이 있습니까? 아니면 이것이 수행되어야하는 방식입니까?


사용 defaultdict:

from collections import defaultdict

foo = defaultdict(int)
foo[bar] += 1

Python> = 2.7에서는 이러한 목적을위한 별도의 Counter 클래스 도 있습니다 . Python 2.5 및 2.6의 경우 백 포트 된 버전을 사용할 수 있습니다 .


dictget()방법은 요청 된 키가 발견되지 않은 경우 기본값을 제공하는 데 사용할 수있는 선택적인 두 번째 매개 변수를 사용합니다 :

foo[bar] = foo.get(bar, 0) + 1

시간 비교를했습니다. 거의 동일합니다. 하지만 한 줄로 된 .get()명령이 가장 빠릅니다.

산출:

get 0.543551800627
exception 0.587318710994
haskey 0.598421703081

암호:

import timeit
import random

RANDLIST = [random.randint(0, 1000) for i in range(10000)]

def get():
    foo = {}
    for bar in RANDLIST:
        foo[bar] = foo.get(bar, 0) + 1


def exception():
    foo = {}
    for bar in RANDLIST:
        try:
            foo[bar] += 1
        except KeyError:
            foo[bar] = 1


def haskey():
    foo = {}
    for bar in RANDLIST:
        if foo.has_key(bar):
            foo[bar] += 1
        else:
            foo[bar] = 1


def main():
    print 'get', timeit.timeit('get()', 'from __main__ import get', number=100)
    print 'exception', timeit.timeit('exception()', 'from __main__ import exception', number=100)
    print 'haskey', timeit.timeit('haskey()', 'from __main__ import haskey', number=100)


if __name__ == '__main__':
    main()

Python> = 2.5의 경우 다음을 수행 할 수 있습니다.

foo[bar] = 1 if bar not in foo else foo[bar]+1

예외 처리에서 제어 구조를 활용할 수도 있습니다. KeyError당신이 존재하지 않는 키에 값을 할당하려고 할 때 예외가 사전에 의해 발생합니다 :

my_dict = {}
try:
    my_dict['a'] += 1
except KeyError, err:    # in 2.6: `except KeyError as err:`
    my_dict['a'] = 1

참조 URL : https://stackoverflow.com/questions/2626059/how-to-add-or-increment-a-dictionary-entry

반응형