2015-05-23 16 views
163

Tôi đang cố gắng sử dụng NetworkX để đọc Shapefile và sử dụng hàm write_shp() để tạo Shapefiles sẽ chứa nút và các cạnh (sau đây ví dụ này - https://networkx.github.io/documentation/latest/reference/readwrite.nx_shp.html), nhưng khi tôi cố gắng chạy mã nó mang lại cho tôi những lỗi sau:Lỗi "'dict' đối tượng không có thuộc tính 'iteritems'" khi cố gắng sử dụng write_shp của()

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 qua pip cài đặt.

Trước khi lỗi này, nó đã cho tôi một số khác có nội dung "xrange không tồn tại" hoặc cái gì đó như vậy, vì vậy tôi đã tra nó lên và chỉ thay đổi 'xrange' thành 'range' trong tệp nx_shp.py, dường 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).

+60

Python 3 được đổi tên thành 'dict.iteritems -> dict.items'. – Blender

+1

oh wow Tôi cảm thấy ngớ ngẩn ngay bây giờ, cảm ơn câu trả lời – friveraa

+4

@Blender: Không, nó không đổi tên 'iteritems' thành' items'. Trước đây đã cho bạn một trình lặp (và 3.x không có phương thức như vậy); cái sau cung cấp cho bạn một khung nhìn (được quay trở lại 2.7 là 'viewitems'). – abarnert

Trả lời

369

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

iteritems() được loại bỏ trong python3, vì vậy bạn không thể sử dụng phương pháp này nữa.

Hãy nhìn vào Python Wiki (Link)

Trong Built-in Thay đổi phần, nó được tuyên bố rằng

Removed dict.iteritems(), dict.iterkeys(), and dict.itervalues().

Instead: use dict.items(), dict.keys(), and dict.values() respectively.

+4

Thay đổi nó thành dict.items() và làm việc như dự định, cảm ơn bạn! – friveraa

+1

'dict.items()' cũng hoạt động trong python 2.7 – industryworker3595112

+0

Thảo luận thêm về điều này được ghi chính thức trong [PEP 469] (http://legacy.python.org/dev/peps/pep-0469/). Cách tiếp cận được khuyến nghị dường như là sử dụng hàm 'iteritems' của các mô-đun' future.utils' hoặc 'six' thay thế. – Mack

3

Tôi đã có một vấn đề tương tự (sử dụng 3.5) và thua 1/2 ngày với 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 
7

Trong python2, chúng tôi đã có .items().iteritems() trong từ điển. dict.items() danh sách các bộ dữ liệu được trả về 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 dict.iteritems() trong các phiên bản sau của Python2. Điều này trả về đối tượng iterator. Toàn bộ từ điển không được sao chép để có mức tiêu thụ bộ nhớ thấp hơn. Những người sử dụng Python2 được dạy sử dụng dict.iteritems() thay vì .items() để có hiệu quả như được giải thích trong mã sau đây.

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 

Output:

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, vì vậy chuyển dictionary.iteritems() để dict.items(), và loại bỏ .iterates() như nó đã không còn cần thiết.

Bạn đã sử dụng dict.iterates() trong Python3 để nó không thành công. Hãy thử sử dụng dict.items() có chức năng giống như dict.iteritems() trong số Python2. Đây là sự cố di chuyển bit nhỏ từ Python2 đến Python3.

3

Trong python2, dictionary.iteritems() là hiệu quả hơn dictionary.items() như vậy trong Python3, các chức năng của dictionary.iteritems() đã được chuyển sang dictionary.items()iteritems() được lấy ra. Vì vậy, bạn đang nhận được lỗi này.

Sử dụng dict.items() bằng Python3 tương tự như dict.iteritems() của Python2.

Các vấn đề liên quan