Lỗi: Đối tượng 'dict' không có thuộc tính 'iteritems'


436

Tôi đang cố gắng sử dụng NetworkX để đọc Shapefile và sử dụng chức năng write_shp()để tạo các Shapefile sẽ chứa các nút và cạnh, nhưng khi tôi cố chạy mã, nó sẽ báo lỗi sau:

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'

Tôi đang sử dụng Python 3.4 và đã cài đặt NetworkX thông qua cài đặt pip.

Trước lỗi này, nó đã đưa cho tôi một lỗi khác nói rằng "xrange không tồn tại" hoặc một cái gì đó tương tự, vì vậy tôi đã tra cứu nó và chỉ đổi xrangethành rangetệp nx_shp.py, có vẻ như đã giải quyết nó.

Từ những gì tôi đã đọc, nó có thể liên quan đến phiên bản Python (Python2 vs Python3).


231
Python 3 đổi tên dict.iteritems -> dict.items.
Máy xay sinh tố

1
oh wow tôi cảm thấy rất ngớ ngẩn ngay bây giờ, cảm ơn vì câu trả lời
friveraa

6
@Blender: Không, nó không đổi tên iteritemsthành items. Cái trước đã cho bạn một iterator (và 3.x không có phương thức như vậy); cái sau cung cấp cho bạn một cái nhìn (được nhập vào 2.7 như viewitems).
abarnert


Đây có thể hoặc không thể là trang tương đương với những gì OP ban đầu liên kết đến: networkx.github.io/documentation/latest/reference/readwrite/ Lỗi
Nathan Arthur

Câu trả lời:


880

Như bạn đang ở trong python3, hãy sử dụng dict.items()thay vìdict.iteritems()

iteritems() đã bị xóa trong python3, vì vậy bạn không thể sử dụng phương pháp này nữa.

Hãy xem phần Python 3.0 Wiki tích hợp thay đổi , trong đó được nêu:

Loại bỏ dict.iteritems(), dict.iterkeys()dict.itervalues().

Thay vào đó: sử dụng dict.items(), dict.keys()dict.values() tương ứng.


Thảo luận thêm về điều này được ghi lại chính thức trong PEP 469 . Cách tiếp cận được đề xuất dường như là sử dụng iteritemschức năng của các mô-đun future.utilshoặc sixthay vào đó.
Mack

33

Trong Python2 , chúng tôi đã có .items().iteritems()trong từ điển. dict.items()trả về danh sách các bộ dữ liệu trong từ điển [(k1,v1),(k2,v2),...]. Nó sao chép tất cả các bộ dữ liệu trong từ điển và tạo danh sách mới. Nếu từ điển là rất lớn, có tác động bộ nhớ rất lớn.

Vì vậy, họ đã tạo ra dict.iteritems()trong các phiên bản sau của Python2. Điều này trả về đối tượng lặp. Toàn bộ từ điển không được sao chép nên có mức tiêu thụ bộ nhớ ít hơn. Những người sử dụng Python2được dạy để sử dụng dict.iteritems()thay vì .items()hiệu quả như được giải thích trong đoạn mã sau.

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

Đầu ra:

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

Trong Python3 , họ muốn làm cho nó hiệu quả hơn, nên đã chuyển dictionary.iteritems()đến dict.items()và xóa .iteritems()vì không còn cần thiết nữa.

Bạn đã sử dụng dict.iteritems()trong Python3nó đã thất bại. Hãy thử sử dụng dict.items()trong đó có các chức năng tương tự như dict.iteritems()của Python2. Đây là một vấn đề di chuyển bit nhỏ từ Python2đến Python3.


5

Tôi đã có một vấn đề tương tự (sử dụng 3,5) và mất 1/2 mỗi ngày cho nó nhưng đây là một cái gì đó hoạt động - tôi đã nghỉ hưu và chỉ học Python để tôi có thể giúp cháu trai của tôi (12) với nó.

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

Trong Python2, dictionary.iteritems()hiệu quả hơn so với dictionary.items()Python3, chức năng của dictionary.iteritems()đã được di chuyển đến dictionary.items()iteritems()bị loại bỏ. Vì vậy, bạn đang nhận được lỗi này.

Sử dụng dict.items()trong Python3 giống như dict.iteritems()của Python2.


-1

Mục đích của .iteritems()việc sử dụng ít không gian bộ nhớ hơn bằng cách đạt được một kết quả tại một thời điểm trong khi lặp. Tôi không chắc tại sao phiên bản Python 3 không hỗ trợ iteritems()mặc dù nó được chứng minh là hiệu quả hơn.items()

Nếu bạn muốn bao gồm một mã hỗ trợ cả PY phiên bản 2 và 3,

try:
    iteritems
except NameError:
    iteritems = items

Điều này có thể giúp nếu bạn triển khai dự án của mình trong một số hệ thống khác và bạn không chắc chắn về phiên bản PY.


-1

Như được trả lời bởi RafaelC, Python 3 đã đổi tên thành dict.iteritems -> dict.items. Hãy thử một phiên bản gói khác. Điều này sẽ liệt kê các gói có sẵn:

python -m pip install yourOwnPackageHere==

Sau đó chạy lại với phiên bản bạn sẽ thử sau == để cài đặt / chuyển đổi phiên bản

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.