다음은 기본적으로 반복을 수행하는 샘플 코드입니다.간단한 파이썬 사전 생성기 만들기
>>> d = {'lol': {'12': '3', '35':''}, 'w': {'12': '3', '35':''}}
>>> def iteritems(s):
... keys = s.keys()
... for key in keys:
... yield key, s[key]
...
>>> for k, v in iteritems(d):
... print k, v
...
w {'12': '3', '35': ''}
lol {'12': '3', '35': ''}
이것은 유효한 생성자입니다. 그러나 생성자 iteritems
은 s.keys()
을 호출하여 사전의 모든 키를 캐시해야합니다. 사전이 크면 (100 개가 넘는 항목) 메모리가 효율적이지 않습니다.
하지만 사전은 순서가 지정된 구조가 아니기 때문에 키 목록을 가져 오는 것이 필수적이라고 생각합니다.
키 수는 키와 값을 계산하는 항목 수보다 훨씬 적습니다.
의견이 있으십니까? 또는 더 나은 방법 (물론 중첩 된 iteation을 지원해야하지만 그것은 또 다른 문제입니다).
아. 그래서 내장되어 있고'keys'가 목록이라고 생각 했었습니다. 큰 실수. 잠깐만, iterkeys가 생성기인가? 아니면 전체 사전을 메모리에 넣어야하는 단순한 반복자인가? – CppLearner
@CppLearner :'iterkeys()'는 * iterator *입니다. 생성기 함수도 반복자를 생성하므로 어떤 의미에서는 예입니다. –
감사합니다. 나는 실제로 혼란 스럽다. 문서에서'.items'는 복사본입니다. 그러나'iteritems'는 반복자이며,'items'를 기반으로하는 iterator 일뿐입니다. 그러면 또 다른 평범한 반복자가되지 않을까요? 의사는'next()'메소드를 사용하는 일반 iterator인지 또는 yield 스테이트먼트의 존재 여부와 같은 generator generator를 가진 iterator인지 여부를 지정하지 않습니다. – CppLearner