2013-02-20 3 views
3

필자는 허가보다 용서를 구하는 것이 더 Pythonic하다는 관점에서이 질문을하고있다. 나는 꽤 절름발이 인 자신을 반복의 비용으로 용서보다는 허락을 위의 코드에서덧붙이 기 전에 dict 키에 목록이 있는지 확인하는 Pythonic 방법

d = dict() 
try: 
    d[est['state']].append(est) 
except Exception: 
    d[est['state']] = [] 
    d[est['state']].append(est) 

:

그래서, 나는처럼 몇 가지 코드를 가지고있어! 그래서, 대안을 알고 없다, 차라리 것 :

d = dict() 
if est['state'] in d: 
    d[est['state']].append(est) 
else: 
    d[est['state']] = [est] 

이 두 가지 접근 방식의 일종의 혹 투성이입니다. 이 작업을 수행하는 더 좋은 방법은 무엇입니까? 최저 지금까지 IS 발견했습니다

from collections import defaultdict 
d = defaultdict(list) 
d[est['state']].append(est) 
+3

그래를, 당신은 2.5이없는 경우'defaultdict' 또는'dict.setdefault'를 사용합니다. 나는 당신이 당신의 자신의 질문에 대답했다고 생각한다. –

+1

'defaultdict'는 굉장하다. 이제'defaultOrderedDict'만이 stdlib에 있다면 ... – nneonneo

+0

완전히 dict.setdefault를 놓쳤습니다. 그것은'dict.get'과 비슷하지만 키의 값을 반환 할뿐만 아니라 기본값을 설정할 것입니다. 야생! –

답변

1

파이썬 방법은 당신이 이미 발견 후자 : defaultdict이 누락 된 값을 공급하는 공장 함수를 호출하는 DICT의 서브 클래스입니다. 파이썬 2.5 이상에서 사용 가능합니다.

>>> import collections 
>>> d = collections.defaultdict(list) 
>>> d[0].append('potato') 
>>> d 
defaultdict(<type 'list'>, {0: ['potato']}) 

그것은 바로이 목적을 위해 존재하는, 그래서 가능하면 dict.setdefault 해킹을 피하십시오.

+0

+1 응답 : D –

0

속도가 걱정되는 경우 몇 가지 방법을 벤치마킹 해 볼 수 있습니다. 나는 "사전에 키가 있다면"접근법을 시도해 보았고 try/except가 평균 약 10 % 더 빠르다는 것을 발견했다. 필자는 이러한 종류의 질문에 대한 필자의 Python 모범 사례가 몇 년마다 변하는 것을 발견했습니다. 이 답변은 파이썬 2.4와의 호환성이 필요한 경우에 유용 할 수 있습니다.

귀하의 예제를 사용하여, 나는 것 :

d = {} 

# Confirm separately that est['state'] does not raise a KeyError. 

state = est['state'] 

try: 
    l = d[state] 
except KeyError: 
    l = [] 
    d[state] = l 

l.append(est) 
관련 문제