파이썬은 키를 생성하거나 키에 요소를 추가하는 방법을 지시합니까?


161

빈 사전이 있습니다. 이름 : dict_x 값이 목록 인 키가 있어야합니다.

별도의 반복에서 키 (예 :) key_123dict_x값 목록에 배치 할 항목 (튜플)을 얻습니다 key_123.

이 키가 이미 존재하면이 항목을 추가하고 싶습니다. 이 키가 존재하지 않으면 빈 목록으로 키를 만든 다음 추가하거나 튜플로 키를 만들고 싶습니다.

앞으로이 키가 다시 나타나면 키가 존재하기 때문에 값을 다시 추가하고 싶습니다.

내 코드는 다음과 같이 구성됩니다.

열쇠와 가치를 얻으십시오.

NOT 키가 있는지 확인하십시오 dict_x.

그리고 그것을 만들지 않으면 : dict_x[key] == []

나중에: dict_x[key].append(value)

이것이 방법입니까? try/except블록을 사용해 볼까요 ?

답변:


253

사용 dict.setdefault():

dic.setdefault(key,[]).append(value)

help (dict.setdefault) :

    setdefault(...)
        D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D

4
나는 이것을 사용 dict_x[key] = [some_value] if not dict_x.has_key(key) else dict_x[key] + [some_value]했지만이 대답은 훨씬 더 나은 방법을 제안합니다. 실제로 그것은 set()논쟁으로 add()
받아 들여지고

66

이를 수행하는 다양한 방법이 있으므로 모양을 비교하고 원하는 것을 선택할 수 있습니다. 나는 내가 가장 "피 토닉" 이라고 생각하는 방식으로 그것들을 주문했고 , 언뜻보기에는 분명하지 않은 장단점을 언급했다.

사용 collections.defaultdict:

import collections
dict_x = collections.defaultdict(list)

...

dict_x[key].append(value)

장점 : 아마도 최상의 성능입니다. 단점 : Python 2.4.x에서는 사용할 수 없습니다.

사용 dict().setdefault():

dict_x = {}

...

dict_x.setdefault(key, []).append(value)

단점 : 미사용 list()s의 비효율적 인 생성 .

사용 try ... except:

dict_x = {}

...

try:
    values = dict_x[key]
except KeyError:
    values = dict_x[key] = []
values.append(value)

또는:

try:
    dict_x[key].append(value)
except KeyError:
    dict_x[key] = [value]

안녕하세요, 왜 .setdefault가 불필요한 사전을 생성한다고 생각하십니까?
Phil

2
나는 .setdefault()불필요한 사전을 만들지 않는다고 생각 합니다. 내 생각 엔 내가있어 불필요한 생성 list의 (즉, []의 두 번째 인수에서) .setdefault()경우에 사용 결코 그것을 key이미 존재합니다. 내가 사용할 수있는 dict.setdefault()(효율적인 키 해싱의 이익을 위해), 및 사용되지 않는 재사용 변수를 사용 list들하지만 코드 몇 줄을 추가합니다.
antak

1
IIRC, 파이썬에서 평등의 빈 목록은 바이트 코드 수준에서 상수로 간주되지만 바이트 코드 전문가의 확인이 필요합니다 (또는 disas 모듈 사용).
gaborous

를 사용 .setdefault하면 dict키 가없는 조회가 KeyErrorcollections.defaultdict(list)dictlist
가끔 발생

내 코드에서 collections.defaultdict와 비슷한 것을 시도했지만 예기치 않은 부작용이있었습니다. 예를 들어, 다음 IDLE 교환을 고려하십시오. >>> list_dict = defaultdict (list) >>> len (list_dict) 0 >>> len (list_dict [0]) 0 >>> len (list_dict) 1 Python이 호출 될 때 나타납니다 기본값은 키를 적극적으로 설정하지 않고 사전에 키를 추가하므로 기본값이 많이 사용되면 빈 목록이 많이 생성됩니다. 사전에 대한 자체 래퍼 함수를 ​​롤링하고 비효율적이지만 더 예측 가능합니다.
RDBury

26

이를 위해 defaultdict 를 사용할 수 있습니다 .

from collections import defaultdict
d = defaultdict(list)
d['key'].append('mykey')

사용 setdefault하지 않는 새 목록을 만들지 않기 때문에이 방법보다 약간 더 효율적 입니다. setdefault항목이 이미 사전에 존재하더라도 모든 호출 은 새 목록을 작성합니다.


14

에서 defaultdict 를 사용할 수 있습니다 collections.

doc의 예 :

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
    d[k].append(v)

0
dictionary['key'] = dictionary.get('key', []) + list_to_append

1
특정 예외가있을 때의 이점에 대해 설명해야합니다. 추가 코드가 필요한 이유는 명확하지 않습니다.
Davis Herring

안녕, 추가 수입없이 대안입니다. 이것은 if 문으로 명확하게 수행 할 수 있습니다. dict [] 대신 .get ()의 힘을 사용하는 대안을 제안하고 있습니다.
Tomas Silva Ebensperger

상위 2 개의 답변에는 가져 오기가없는 두 가지 방법이 언급되어 있습니다 (그렇지는 않지만 dict.get).
Davis Herring
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.