items()
사전에서 키, 값 쌍을 반복 하여 호출해야하는 이유는 무엇 입니까? 즉.
dic = {'one': '1', 'two': '2'}
for k, v in dic.items():
print(k, v)
사전을 반복하는 기본 동작이 아닌 이유
for k, v in dic:
print(k, v)
답변
모든 파이썬 컨테이너 C에 대해 기대하는 것은
for item in C:
assert item in C
잘 전달합니다 -하지 않을 당신이 중 하나를 의미하는 경우가 놀라게 찾을 수 in
(루프 절) 다른 (존재 검사)는 완전히 다른 의미를 가지고 있었다? 확실합니다! 그것은 자연스럽게 목록, 세트, 튜플 등에 대해 작동합니다 …
따라서 C
사전이 언제 루프 in
에서 키 / 값 튜플을 생성 for
하려면 가장 놀랍게도 in
왼손 피연산자와 같은 튜플을 포함 확인해야합니다.
얼마나 유용한가요? 꽤 쓸모없는 참으로, 기본적으로 만들기 if (key, value) in C
위해 동의어를 if C.get(key) == value
내가 수행하거나 수행 싶었던 생각되는 체크 인, 100 배 드물게 것보다 – if k in C
실제로 수단 키의 존재 확인, 만 완전히 값을 무시합니다.
반면에 키만 반복하려는 경우는 매우 일반적입니다. 예 :
for k in thedict:
thedict[k] += 1
뿐만 아니라 가치를 갖는 것은 특히 도움이되지 않습니다 :
for k, v in thedict.items():
thedict[k] = v + 1
실제로 다소 덜 명확하고 덜 간결합니다. ( items
키 / 값 쌍을 얻는 데 사용하는 “적절한”방법의 원래 철자입니다. 불행히도 이러한 접근자가 전체 목록을 반환 한 날로 돌아 왔으므로 “반복”을 지원하기 위해 대체 철자를 도입해야했습니다. 그리고 iteritems
그것은이었다 – 이전의 파이썬 버전과 이전 버전과의 호환성에 제약이 많이 약화 된 파이썬 3에, 그것은되었다 items
) 다시.
답변
내 추측 : 전체 튜플을 사용하는 것이 루핑에 더 직관적이지만을 사용하여 멤버쉽을 테스트하는 경우에는 덜 직관적입니다 in
.
if key in counts:
counts[key] += 1
else:
counts[key] = 1
에 대한 키와 값을 모두 지정해야하는 경우 해당 코드가 실제로 작동하지 않습니다 in
. 키와 값이 모두 사전에 있는지 확인하는 유스 케이스를 상상하기가 어렵습니다. 키만 테스트하는 것이 훨씬 더 자연 스럽습니다.
# When would you ever write a condition like this?
if (key, value) in dict:
이제 in
작업자 for ... in
가 동일한 항목을 조작 할 필요가 없습니다 . 구현 측면에서는 서로 다른 작업입니다 ( __contains__
vs. __iter__
). 그러나 그 작은 불일치는 다소 혼란스럽고 일관성이 없습니다.