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 xrange
ke range
dalam file nx_shp.py, yang sepertinya menyelesaikannya.
Dari apa yang saya baca itu bisa terkait dengan versi Python (Python2 vs Python3).
python
python-3.x
dictionary
friveraa
sumber
sumber
dict.iteritems -> dict.items
.iteritems
menjadiitems
. Yang pertama memberi Anda iterator (dan 3.x tidak memiliki metode seperti itu); yang terakhir memberi Anda tampilan (yang di-backport ke 2,7 sebagaiviewitems
).Jawaban:
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:
sumber
iteritems
fungsi modulfuture.utils
atausix
sebagai gantinya.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 menggunakanPython2
diajarkan untuk menggunakandict.iteritems()
alih-alih.items()
untuk efisiensi seperti yang dijelaskan dalam kode berikut.Keluaran:
Dalam Python3 , mereka ingin membuatnya lebih efisien, jadi pindah
dictionary.iteritems()
kedict.items()
, dan dihapus.iteritems()
karena tidak lagi diperlukan.Anda telah menggunakan
dict.iteritems()
diPython3
sehingga telah gagal. Coba gunakandict.items()
yang memiliki fungsi yang samadict.iteritems()
dariPython2
. Ini adalah masalah migrasi kecil dariPython2
kePython3
.sumber
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.
sumber
Dalam Python2,
dictionary.iteritems()
lebih efisien daripadadictionary.items()
di Python3, fungsidictionary.iteritems()
telah dimigrasikan kedictionary.items()
daniteritems()
dihapus. Jadi, Anda mendapatkan kesalahan ini.Gunakan
dict.items()
di Python3 yang sama dengandict.iteritems()
Python2.sumber
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 mendukungiteritems()
meskipun sudah terbukti lebih efisien daripada.items()
Jika Anda ingin memasukkan kode yang mendukung PY versi 2 dan 3,
Ini dapat membantu jika Anda menggunakan proyek Anda di beberapa sistem lain dan Anda tidak yakin tentang versi PY.
sumber
Sebagaimana dijawab oleh RafaelC, Python 3 berganti nama menjadi dict.iteritems -> dict.items. Coba versi paket lain. Ini akan mencantumkan paket yang tersedia:
Kemudian jalankan kembali dengan versi yang akan Anda coba setelah == untuk menginstal / mengganti versi
sumber