Kesalahan: “objek 'dict' tidak memiliki atribut 'iteritems'”

436

Saya mencoba menggunakan NetworkX untuk membaca Shapefile dan menggunakan fungsi write_shp()untuk menghasilkan Shapefile yang akan berisi node dan ujung, tetapi ketika saya mencoba menjalankan kode itu memberi saya kesalahan berikut:

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'

Saya menggunakan Python 3.4 dan menginstal NetworkX via pip install.

Sebelum kesalahan ini, itu sudah memberi saya satu lagi yang mengatakan "xrange tidak ada" atau sesuatu seperti itu, jadi saya mencarinya dan hanya berubah xrangeke rangedalam file nx_shp.py, yang sepertinya menyelesaikannya.

Dari apa yang saya baca itu bisa terkait dengan versi Python (Python2 vs Python3).

friveraa
sumber
233
Python 3 diganti nama dict.iteritems -> dict.items.
Blender
1
oh wow saya merasa sangat konyol sekarang, terima kasih atas jawabannya
friveraa
6
@Blender: Tidak, itu tidak mengubah nama iteritemsmenjadi items. Yang pertama memberi Anda iterator (dan 3.x tidak memiliki metode seperti itu); yang terakhir memberi Anda tampilan (yang di-backport ke 2,7 sebagai viewitems).
abarnert
2
kemungkinan duplikat dari iter, nilai, item dalam kamus tidak berfungsi
Łukasz Rogalski
Ini mungkin atau mungkin bukan halaman yang setara dengan yang awalnya ditautkan oleh OP: networkx.github.io/documentation/latest/reference/readwrite/…
Nathan Arthur

Jawaban:

881

Saat Anda menggunakan python3, gunakan dict.items()sebagai gantidict.iteritems()

iteritems() telah dihapus di python3, jadi Anda tidak dapat menggunakan metode ini lagi.

Lihatlah bagian Perubahan bawaan Wiki Python 3.0 , di mana dinyatakan:

Dihapus dict.iteritems(), dict.iterkeys()dan dict.itervalues().

Sebaliknya: penggunaan dict.items(), dict.keys()dan dict.values() masing-masing.

rafaelc
sumber
Diskusi lebih lanjut tentang ini secara resmi dicatat dalam PEP 469 . Pendekatan yang disarankan tampaknya menggunakan iteritemsfungsi modul future.utilsatau sixsebagai gantinya.
Mack
33

Dalam Python2 , kami memiliki .items()dan .iteritems()dalam kamus. dict.items()daftar tuple dalam kamus yang dikembalikan [(k1,v1),(k2,v2),...]. Itu menyalin semua tupel dalam kamus dan membuat daftar baru. Jika kamus sangat besar, ada dampak memori yang sangat besar.

Jadi mereka membuat dict.iteritems()versi Python2 yang lebih baru. Ini mengembalikan objek iterator. Seluruh kamus tidak disalin sehingga konsumsi memori lebih sedikit. Orang yang menggunakan Python2diajarkan untuk menggunakan dict.iteritems()alih-alih .items()untuk efisiensi seperti yang dijelaskan dalam kode berikut.

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

Keluaran:

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

Dalam Python3 , mereka ingin membuatnya lebih efisien, jadi pindah dictionary.iteritems()ke dict.items(), dan dihapus .iteritems()karena tidak lagi diperlukan.

Anda telah menggunakan dict.iteritems()di Python3sehingga telah gagal. Coba gunakan dict.items()yang memiliki fungsi yang sama dict.iteritems()dari Python2. Ini adalah masalah migrasi kecil dari Python2ke Python3.

Prabhu
sumber
5

Saya memiliki masalah yang sama (menggunakan 3.5) dan kehilangan 1/2 hari untuk itu tetapi di sini ada sesuatu yang bekerja - saya sudah pensiun dan baru belajar Python sehingga saya dapat membantu cucu saya (12) dengan itu.

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
Ayah Besar
sumber
5

Dalam Python2, dictionary.iteritems()lebih efisien daripada dictionary.items()di Python3, fungsi dictionary.iteritems()telah dimigrasikan ke dictionary.items()daniteritems() dihapus. Jadi, Anda mendapatkan kesalahan ini.

Gunakan dict.items()di Python3 yang sama dengan dict.iteritems()Python2.


sumber
-1

Tujuannya .iteritems()adalah untuk menggunakan lebih sedikit ruang memori dengan menghasilkan satu hasil pada satu waktu sambil mengulang. Saya tidak yakin mengapa versi Python 3 tidak mendukung iteritems()meskipun sudah terbukti lebih efisien daripada.items()

Jika Anda ingin memasukkan kode yang mendukung PY versi 2 dan 3,

try:
    iteritems
except NameError:
    iteritems = items

Ini dapat membantu jika Anda menggunakan proyek Anda di beberapa sistem lain dan Anda tidak yakin tentang versi PY.

DivyaMaheswaran
sumber
-1

Sebagaimana dijawab oleh RafaelC, Python 3 berganti nama menjadi dict.iteritems -> dict.items. Coba versi paket lain. Ini akan mencantumkan paket yang tersedia:

python -m pip install yourOwnPackageHere==

Kemudian jalankan kembali dengan versi yang akan Anda coba setelah == untuk menginstal / mengganti versi

Punnerud
sumber