파이썬에서 사전을 반복 할 때 왜 .items ()를 호출해야합니까?


131

items()사전에서 키, 값 쌍을 반복 하여 호출해야하는 이유는 무엇 입니까? 즉.

dic = {'one': '1', 'two': '2'}
for k, v in dic.items():
    print(k, v)

사전을 반복하는 기본 동작이 아닌 이유

for k, v in dic:
    print(k, v)

답변:


171

모든 파이썬 컨테이너 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) 다시.


10

내 추측 : 전체 튜플을 사용하는 것이 루핑에 더 직관적이지만을 사용하여 멤버쉽을 테스트하는 경우에는 덜 직관적입니다 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__). 그러나 그 작은 불일치는 다소 혼란스럽고 일관성이 없습니다.


대한 감안할 때 마다 내가 생각할 수있는 반복 가능한 내장 다른 유형의 x in foo경우에만 i에서이 for i in foo값 가정 x어느 시점을, 나는 그것이 매우 될 것이라고 말할 것입니다 거대한 불일치.
aaronasterling
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.