ข้อผิดพลาด: วัตถุ“ 'dict' ไม่มีแอตทริบิวต์ 'iteritems'”


436

ฉันพยายามใช้ NetworkX เพื่ออ่าน Shapefile และใช้ฟังก์ชันwrite_shp()เพื่อสร้าง Shapefiles ที่จะมีโหนดและขอบ แต่เมื่อฉันพยายามเรียกใช้รหัสมันทำให้ฉันมีข้อผิดพลาดต่อไปนี้:

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 และติดตั้ง NetworkX ผ่านการติดตั้ง pip

ก่อนที่ข้อผิดพลาดนี้จะให้อีกอันหนึ่งที่บอกว่า "ไม่มี xrange" หรืออะไรทำนองนั้นดังนั้นฉันจึงค้นหาและเปลี่ยนxrangeเป็นrangeในไฟล์ nx_shp.py ซึ่งดูเหมือนจะแก้ไขได้

จากสิ่งที่ฉันได้อ่านมันอาจเกี่ยวข้องกับรุ่น Python (Python2 กับ Python3)


231
งูหลาม 3 dict.iteritems -> dict.itemsเปลี่ยนชื่อ
เครื่องปั่น

1
โอ้ว้าวฉันรู้สึกโง่มากในตอนนี้ขอบคุณคำตอบ
friveraa

6
@Blender: ไม่มีก็ไม่ได้เปลี่ยนชื่อไปiteritems itemsอดีตให้คุณตัววนซ้ำ (และ 3.x ไม่มีวิธีการดังกล่าว) หลังให้มุมมอง (ซึ่งถูก backported เป็น 2.7 เป็นviewitems)
abarnert


นี้อาจจะหรืออาจจะไม่หน้าเทียบเท่ากับสิ่งที่ OP เดิมที่เชื่อมโยงกับ: networkx.github.io/documentation/latest/reference/readwrite/...
นาธานอาร์เธอร์

คำตอบ:


881

ในขณะที่คุณอยู่ใน python3 ให้ใช้dict.items()แทนdict.iteritems()

iteritems() ถูกลบใน python3 ดังนั้นคุณจึงไม่สามารถใช้วิธีนี้ได้อีก

ดูที่ส่วนการเปลี่ยนแปลงในตัวของ Python 3.0 Wiki ซึ่งระบุไว้:

ลบออกdict.iteritems(), และdict.iterkeys()dict.itervalues()

แทนการใช้งานdict.items(), dict.keys()และdict.values() ตามลำดับ


การอภิปรายต่อไปนี้จะถูกบันทึกไว้อย่างเป็นทางการในPEP 469 แนวทางที่แนะนำนั้นดูเหมือนจะใช้iteritemsฟังก์ชั่นของโมดูลfuture.utilsหรือsixแทน
Mack

33

ในPython2เรามี.items()และ.iteritems()ในพจนานุกรม dict.items()รายการกลับของ tuples [(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 ไป แต่นี่เป็นสิ่งที่ใช้ได้ - ฉันเลิกเรียนแล้วก็เรียน Python เพื่อฉันจะได้ช่วยหลานชายของฉัน (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()ใน Python3 ซึ่งเหมือนกับdict.iteritems()Python2


-1

วัตถุประสงค์ของ.iteritems()การใช้พื้นที่หน่วยความจำน้อยลงโดยให้ผลลัพธ์ครั้งละหนึ่งผลลัพธ์ขณะวนลูป ฉันไม่แน่ใจว่าทำไม Python 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.