오류 : " 'dict'객체에 'iteritems'속성이 없습니다.”


436

NetworkX를 사용하여 Shapefile을 읽고 함수 write_shp()를 사용 하여 노드와 가장자리를 포함하는 Shapefile을 생성하려고하는데 코드를 실행하려고하면 다음 오류가 발생합니다.

Traceback (most recent call last):   File
"C:/Users/Felipe/PycharmProjects/untitled/asdf.py", line 4, in
<module>
    nx.write_shp(redVial, "shapefiles")   File "C:\Python34\lib\site-packages\networkx\readwrite\nx_shp.py", line
192, in write_shp
    for key, data in e[2].iteritems(): AttributeError: 'dict' object has no attribute 'iteritems'

Python 3.4를 사용하고 pip install을 통해 NetworkX를 설치했습니다.

나는 그것을 보았다 있도록이 오류 전에 이미 나에게 "xrange이 존재하지 않습니다"또는 그런 일 밝혔다 다른 하나를 부여했다 단지 변화 xrangerange그것을 해결 듯 nx_shp.py 파일에.

내가 읽은 내용에서 파이썬 버전 (Python2 vs Python3)과 관련이 있습니다.


231
파이썬 3의 이름이 변경되었습니다 dict.iteritems -> dict.items.
Blender

1
오 와우, 나는 지금 너무 바보 같은 느낌, 답변 주셔서 감사합니다
friveraa

6
@Blender : 아니요,로 이름 iteritems이 바뀌지 않았습니다 items. 전자는 반복자를 주었다 (그리고 3.x는 그런 방법이 없다). 후자는 (2.7로 백 포트 된) 뷰를 제공합니다 viewitems.
abarnert


이것은 OP가 원래 링크했던 것과 동일한 페이지 일 수도 있고 아닐 수도 있습니다 : networkx.github.io/documentation/latest/reference/readwrite/…
Nathan Arthur

답변:


881

python3에서와 같이 dict.items()대신dict.iteritems()

iteritems() python3에서 제거되었으므로 더 이상이 방법을 사용할 수 없습니다.

Python 3.0 Wiki Built-in Changes 섹션을 살펴보십시오 .

제거 dict.iteritems(), dict.iterkeys()dict.itervalues().

대신 : 사용 dict.items(), dict.keys()dict.values() 각각.


이에 대한 추가 논의는 공식적으로 PEP 469에 기록되어 있습니다. 권장되는 접근 방식 iteritemsfuture.utils또는 six모듈 의 기능을 대신 사용하는 것으로 보입니다 .
Mack

33

에서 Python2 , 우리는했다 .items().iteritems()사전이다. dict.items()사전에 튜플 목록을 반환했습니다 [(k1,v1),(k2,v2),...]. 모든 튜플을 사전에 복사하고 새 목록을 작성했습니다. 사전이 매우 큰 경우 메모리 영향이 매우 큽니다.

그래서 그들은 dict.iteritems()이후 버전의 Python2에서 만들었습니다 . 이터레이터 객체를 반환했습니다. 전체 사전이 복사되지 않아서 메모리 소비가 줄어 듭니다. 다음 코드에 설명 된대로 효율성을 높이기 Python2위해 사용 dict.iteritems()하는 사람들 에게 사용하도록 지시합니다 .items().

import timeit

d = {i:i*2 for i in xrange(10000000)}  
start = timeit.default_timer()
for key,value in d.items():
    tmp = key + value #do something like print
t1 = timeit.default_timer() - start

start = timeit.default_timer()
for key,value in d.iteritems():
    tmp = key + value
t2 = timeit.default_timer() - start

산출:

Time with d.items(): 9.04773592949
Time with d.iteritems(): 2.17707300186

Python3 에서는 더 효율적으로 만들기를 원했기 때문에로 이동 dictionary.iteritems()하여 더 이상 필요하지 않으므로 dict.items()제거 .iteritems()했습니다.

당신은 그것을 사용 dict.iteritems()하여 Python3실패했습니다. 사용해보십시오 dict.items()와 동일한 기능이있는 dict.iteritems()의를 Python2. 이것은에서 작은 비트 마이그레이션 문제 Python2Python3.


5

비슷한 문제가 있었으며 (3.5 사용) 하루에 1/2을 잃었지만 여기에 효과가 있습니다. 은퇴하고 파이썬을 배우기 때문에 손자 (12)가 도울 수 있습니다.

mydict2={'Atlanta':78,'Macon':85,'Savannah':72}
maxval=(max(mydict2.values()))
print(maxval)
mykey=[key for key,value in mydict2.items()if value==maxval][0]
print(mykey)
YEILDS; 
85
Macon

5

Python2에서 dictionary.iteritems()보다 더 효율적 dictionary.items()이므로 Python3에서의 기능은 dictionary.iteritems()이전되었습니다 dictionary.items()iteritems()제거된다. 따라서이 오류가 발생합니다.

dict.items()Python2와 동일한 Python3에서 사용하십시오 dict.iteritems().


-1

.iteritems()반복하는 동안 한 번에 하나의 결과를 생성하여 메모리 공간을 적게 사용 하는 것이 목적 이었습니다. 파이썬 3 버전이 왜 iteritems()효율적 이지 않은지 확실하지 않지만 왜 확실하지 않습니다.items()

PY 버전 2와 3을 모두 지원하는 코드를 포함하려면

try:
    iteritems
except NameError:
    iteritems = items

이것은 다른 시스템에 프로젝트를 배포하고 PY 버전에 대해 잘 모르는 경우 도움이 될 수 있습니다.


-1

RafaelC의 답변에 따라 Python 3은 dict.iteritems-> dict.items로 이름을 변경했습니다. 다른 패키지 버전을 사용해보십시오. 사용 가능한 패키지가 나열됩니다.

python -m pip install yourOwnPackageHere==

그런 다음 == 이후 버전을 설치 / 전환하기 위해 시도 할 버전으로 다시 실행하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.