2012-05-02 2 views
8

파이썬 2와 파이썬 3 모두에서 작동하는 사전의 값/항목을 효율적으로 반복 처리하는 방법이 있습니까?파이썬 2와 파이썬 3 모두에서 사전을 균일하게 반복하는 생성자

파이썬 2에서, 나는

for x in mydict: 
for x in mydict.iterkeys(): 
for x in mydict.viewkeys(): 
for x in mydict.itervalues(): 
for x in mydict.viewvalues(): 
for x in mydict.iteritems(): 
for x in mydict.viewitems(): 

파이썬 3에서 쓸 수 있습니다, 나는 다음과 같은 가능성이 : 나는 for x in mydict와 키를 반복하고, 작품 것을 할 수 있습니다, 그래서

for x in mydict: 
for x in mydict.keys(): 
for x in mydict.values(): 
for x in mydict.items(): 

을 파이썬 2와 3 모두에서 그렇습니다. 그렇지만 보편적으로 작동하는 값과 키 - 값 쌍 ('items')을 반복하는 방법이 있습니까? 두 Python 버전에서 모두 실행될 수있는 Python 코드를 작성해야합니다.

는 (보조 노트에, 반복자와 기타 장애물을 쉽게 우회 할 수 있으며, 예를 들어 걸릴 그러나, 사전 방법이 mapzip처럼 쉽게 재정의 할 수 없습니다
if sys.version_info.major<3: 
    from itertools import izip as zip, imap as map 

.)

하나를 아이디어?

+1

편집 : 발전기가 사전을 반복한다고 말한 것 같습니다. – jamylak

+0

@jamylak : 예, 감사합니다. – Daniel

답변

9

값에()() 버전의 발현 주위에 []를 사용을 답변

for value in (mydict[key] for key in mydict): 

또는

def dict_values(d): 
    return (mydict[key] for key in mydict) 

def dict_items(d): 
    return ((key, mydict[key]) for key in mydict) 

for value in dict_values(mydict): 
    ... 

for value in dict_items(mydict): 
    ... 

이것은 꽤 엉터리입니다. 당신은 파이썬 버전을 확인하는 대신 발전기를 반환하는

내가 더 나은 질문은 2to3 잘 작동 좋은 Python3 코드를 생성 Python2 코드를 작성하는 방법을 것 같아요 적절한 d.items() 또는 d.iteritems()을 반환 할 수

+4

+1입니다. – Daenyth

+0

필자는 Python 버전 (Python 스크립트 시작 부분)을 확인하고 올바른 반복자'd.items()'또는'd.iteritems()'를 반환하는 gnibbler의 제안을 선호합니다. – Daniel

0

Python2.7은 사전에 (키, 값) 튜플을 반복 할 수있는 사전에 .items 메소드가 있습니다. Python3은 동일한 API를 사용합니다 (구현은 다르지만). 이 방법이 효과가 있습니까?

+0

하지만 Python2에서'.items()'는 OP가 피하려고하는 임시 목록을 만듭니다. –

+0

질문은 명확하지 않지만 저자가 생성자를 원한다고 생각합니다. 나는 그것을 반영하기 위해 질문의 제목을 바꾸었다. – jamylak

+0

나는 그것을 알아 차리지 못했다. 감사. –

3

이 당신에게 발전기 줄 것이다 : 당신이 목록을 원하는 경우

for key,value in ((key,mydict[key] for key in mydict) 

가 대신 그냥 다른 무지 렁의 외부

+1

더 쉬운 방법은 mydict.iteritems()를 사용하는 것입니다. –

+0

게시물에있는 내용은 2와 3 모두에서 작동하지만'.iteritems()'는 3에 존재하지 않습니다. 적어도 그 이름으로는 안되며, 그것은 .items()로 이름이 바뀌 었습니다. –

+0

위의 솔루션을 사용할 수 있습니다. 사전 크기가 너무 크면 새 목록을 만드는 것이 큰 목록을 만드는 것으로 믿기 때문에 목록에서 벗어나는 것을 선호합니다. –

7

코드가 Py2와 Py3 모두에서 작동 다음

def iteritems(d): 
    'Factor-out Py2-to-3 differences in dictionary item iterator methods' 
    try: 
     return d.iteritems() 
    except AttributeError: 
     return d.items() 

d = dict(red=1, blue=2, green=3) 
for k, v in iteritems(d): 
    print(k) 
    print(v) 
    print('') 

주,이 솔루션은 기본 반복자를 사용하기보다는 자신의 발전기를 압연하고 자신의 조회를하는 장점이있다. 네이티브 반복자는 다른 솔루션보다 빠릅니다.