2014-10-06 3 views
0

x는 튜플 파이썬에서 KeyError를 블록 제외 : (X1, X2)시도 -

try: 
    clusters[bestmukey].append(x) # statment 1 
except KeyError: 
    clusters[bestmukey] = [x]  # statement 2 

(1) 어떻게 문 1 문 (2) 다른 일을해야합니까?

(2) 왜 분리 된 문장이 필요한가요?

+0

'clusters'가 사전이라고 가정하면 문 1은 목록 인 'value'에 요소를 추가합니다. 키 쌍 값이 초기화되지 않은 경우 'key error'가 발생합니다. 따라서 새로운 키, 값 쌍을 만드는 문 2. – Akavall

+0

'dict.setdefault'는'try/except'없이 똑같이 할 것입니다 –

답변

3

clusters[bestmukey].append(x)에는 이미 clusters[bestmukey]이 있어야하며 추가 할 수있는 목록이어야합니다. clusters에 올바른 키가 없으면 KeyError가 높아집니다.

clusters[bestmukey] = [x] (항상 clusters이 내가 가정하고있는 사전입니다) 한 요소가있는 새 목록에 값을 설정합니다.

코드의 효과는 키가 이미 없으면 새로운 단일 값으로 목록을 작성하거나 이미 존재하는 경우 기존 목록에 값을 추가하는 것입니다.

defaultdict을 사용하여 try/except를 사용하지 않고 동일한 효과를 얻을 수 있습니다. defaultdict는이 논리를 효과적으로 자체적으로 래핑합니다.

+0

그래서 분명합니다! 고맙습니다! –

0

분명히 clusters은 값이 목록 인 dict입니다. 이 코드는 bestmukey 키가있는 경우 해당 목록에 추가하려고 시도하지만 그렇지 않은 경우 키를 추가하고 목록을 시작합니다.

보통 (뭔가 당신이 할당이 좌변, 왼쪽 값을 불리는) 어떤 상관없이, clusters[bestmukey]에 쓸 것 문 # 2에 defaultdict

0

clusters[bestmukey] = ...를 사용하는 것이 바람직하지 않을 것이다. 그러나 문 # 1의 clusters[bestmukey]은 rvalue (사용자가 지정하는 것이 아닌)이며 Python의 마음에 존재해야하거나 오류가 발생합니다. Ruby 나 다른 언어에서와 같이 오류가 발생하지 않았더라도 append *을 사용할 수 없으므로 # 1 문을 사용할 수 없습니다.


*) defaultdict으로 할 수 있습니다. 그러나 그것은 또 다른 이야기입니다.