2012-09-04 8 views
1

다음은 기본적으로 반복을 수행하는 샘플 코드입니다.간단한 파이썬 사전 생성기 만들기

>>> 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': ''} 

이것은 유효한 생성자입니다. 그러나 생성자 iteritemss.keys()을 호출하여 사전의 모든 키를 캐시해야합니다. 사전이 크면 (100 개가 넘는 항목) 메모리가 효율적이지 않습니다.

하지만 사전은 순서가 지정된 구조가 아니기 때문에 키 목록을 가져 오는 것이 필수적이라고 생각합니다.

키 수는 키와 값을 계산하는 항목 수보다 훨씬 적습니다.

의견이 있으십니까? 또는 더 나은 방법 (물론 중첩 된 iteation을 지원해야하지만 그것은 또 다른 문제입니다).

답변

9

파이썬 2.x에서 .iterkeys()을 사용하십시오. 파이썬 3.x에서는 .keys() is a view이고 새로운 목록은 아닙니다. python 2.7에서는 viewkeys() method을 사용하여 동일한 결과를 얻을 수도 있습니다.

동등한 .iteritems() method가 있으며 유틸리티 방법이 중복됩니다. :-) python 3.x와 2.7에 대해서도 같은 말을 적용합니다. 제공된 문서를보십시오.

+0

아. 그래서 내장되어 있고'keys'가 목록이라고 생각 했었습니다. 큰 실수. 잠깐만, iterkeys가 생성기인가? 아니면 전체 사전을 메모리에 넣어야하는 단순한 반복자인가? – CppLearner

+0

@CppLearner :'iterkeys()'는 * iterator *입니다. 생성기 함수도 반복자를 생성하므로 어떤 의미에서는 예입니다. –

+0

감사합니다. 나는 실제로 혼란 스럽다. 문서에서'.items'는 복사본입니다. 그러나'iteritems'는 반복자이며,'items'를 기반으로하는 iterator 일뿐입니다. 그러면 또 다른 평범한 반복자가되지 않을까요? 의사는'next()'메소드를 사용하는 일반 iterator인지 또는 yield 스테이트먼트의 존재 여부와 같은 generator generator를 가진 iterator인지 여부를 지정하지 않습니다. – CppLearner

2

당신은 파이썬 2.x에서의 중간 목록을 방지하기 위해 바퀴를 개혁하고 바로 사용

for k, v in d.iteritems(): 
    print k, v 

파이썬 3.x를 사용에서 :

for k, v in d.items(): 
    print(k, v) 

.items() 방법 때문에 해당 버전에서는 반복 가능한 view 객체를 반환합니다.