x는 튜플 파이썬에서 KeyError를 블록 제외 : (X1, X2)시도 -
try:
clusters[bestmukey].append(x) # statment 1
except KeyError:
clusters[bestmukey] = [x] # statement 2
(1) 어떻게 문 1 문 (2) 다른 일을해야합니까?
(2) 왜 분리 된 문장이 필요한가요?
x는 튜플 파이썬에서 KeyError를 블록 제외 : (X1, X2)시도 -
try:
clusters[bestmukey].append(x) # statment 1
except KeyError:
clusters[bestmukey] = [x] # statement 2
(1) 어떻게 문 1 문 (2) 다른 일을해야합니까?
(2) 왜 분리 된 문장이 필요한가요?
clusters[bestmukey].append(x)
에는 이미 clusters[bestmukey]
이 있어야하며 추가 할 수있는 목록이어야합니다. clusters
에 올바른 키가 없으면 KeyError가 높아집니다.
clusters[bestmukey] = [x]
(항상 clusters
이 내가 가정하고있는 사전입니다) 한 요소가있는 새 목록에 값을 설정합니다.
코드의 효과는 키가 이미 없으면 새로운 단일 값으로 목록을 작성하거나 이미 존재하는 경우 기존 목록에 값을 추가하는 것입니다.
defaultdict
을 사용하여 try/except를 사용하지 않고 동일한 효과를 얻을 수 있습니다. defaultdict는이 논리를 효과적으로 자체적으로 래핑합니다.
그래서 분명합니다! 고맙습니다! –
분명히 clusters
은 값이 목록 인 dict
입니다. 이 코드는 bestmukey
키가있는 경우 해당 목록에 추가하려고 시도하지만 그렇지 않은 경우 키를 추가하고 목록을 시작합니다.
보통 (뭔가 당신이 할당이 좌변, 왼쪽 값을 불리는) 어떤 상관없이, clusters[bestmukey]
에 쓸 것 문 # 2에 defaultdict
clusters[bestmukey] = ...
를 사용하는 것이 바람직하지 않을 것이다. 그러나 문 # 1의 clusters[bestmukey]
은 rvalue (사용자가 지정하는 것이 아닌)이며 Python의 마음에 존재해야하거나 오류가 발생합니다. Ruby 나 다른 언어에서와 같이 오류가 발생하지 않았더라도 append
*을 사용할 수 없으므로 # 1 문을 사용할 수 없습니다.
*) defaultdict
으로 할 수 있습니다. 그러나 그것은 또 다른 이야기입니다.
'clusters'가 사전이라고 가정하면 문 1은 목록 인 'value'에 요소를 추가합니다. 키 쌍 값이 초기화되지 않은 경우 'key error'가 발생합니다. 따라서 새로운 키, 값 쌍을 만드는 문 2. – Akavall
'dict.setdefault'는'try/except'없이 똑같이 할 것입니다 –