Hata: “'dict' nesnesinin 'iteritems' özelliği yok”


436

Bir Shapefile okumak write_shp()ve düğümleri ve kenarları içeren Shapefiles oluşturmak için işlevini kullanmak için NetworkX kullanmaya çalışıyorum , ama kodu çalıştırmaya çalıştığınızda bana aşağıdaki hata veriyor:

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 kullanıyorum ve PipX üzerinden NetworkX yükledim.

Ben baktım bu yüzden bu hatanın önce zaten bana "xrange yok" veya buna benzer bir şey söyledi bir tane vermişti ve sadece değişmiş xrangeiçin rangebunu çözmek gibiydi nx_shp.py dosyasında.

Okuduğum kadarıyla Python sürümü (Python2 vs Python3) ile ilgili olabilir.


231
Python 3 yeniden adlandırıldı dict.iteritems -> dict.items.
Blender

1
oh vay şu anda kendimi çok aptal hissediyorum, cevap için teşekkürler
friveraa

6
@Blender: No, bu adlandırmak vermedi iteritemsiçin items. Birincisi size bir yineleyici verdi (ve 3.x'in böyle bir yöntemi yok); ikincisi (2.7 olarak döndürülen viewitems) bir görünüm verir .
abarnert


Bu, OP'nin orijinal olarak bağlantı verdiği sayfanın karşılığı olabilir veya olmayabilir: networkx.github.io/documentation/latest/reference/readwrite/…
Nathan Arthur

Yanıtlar:


881

Eğer python3 bulunduğu için, kullanmak dict.items()yerinedict.iteritems()

iteritems() python3 içinde kaldırıldığından artık bu yöntemi kullanamazsınız.

Belirtildiği Python 3.0 Wiki Yerleşik Değişiklikler bölümüne bir göz atın :

Kaldırılan dict.iteritems(), dict.iterkeys()ve dict.itervalues().

Bunun yerine: kullanım dict.items(), dict.keys()ve dict.values() sırasıyla.


Bununla ilgili daha fazla tartışma resmi olarak PEP 469'da kaydedilmiştir . Önerilen yaklaşım bunun yerine veya modüllerinin iteritemsişlevini kullanmak gibi görünmektedir . future.utilssix
Mack

33

In Python2 , biz .items()ve .iteritems()sözlüklerde. dict.items()sözlükte tuples listesi döndürdü [(k1,v1),(k2,v2),...]. Sözlükteki tüm tuplleri kopyaladı ve yeni bir liste oluşturdu. Sözlük çok büyükse, bellek etkisi çok büyüktür.

Böylece dict.iteritems()Python2'nin sonraki sürümlerinde oluşturdular . Bu yineleyici nesnesi döndürdü. Tüm sözlük kopyalanmadı, bu nedenle daha az bellek tüketimi var. Kullanan Python2kişilere aşağıdaki kodda açıklandığı gibi verimlilik dict.iteritems()yerine kullanımı öğretilir .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

Çıktı:

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

In Python3 , bu kadar taşındı daha verimli yapmak istedim dictionary.iteritems()etmek dict.items()ve kaldırılan .iteritems()artık ihtiyaç duyulur.

Kullandınız dict.iteritems(), Python3bu yüzden başarısız oldu. Kullanmayı deneyin dict.items()aynı özelliğe sahip olduğu dict.iteritems()bir Python2. Bu bir nebze göç konudur Python2için Python3.


5

Ben benzer bir sorun vardı (3.5 kullanarak) ve buna günde 1/2 kaybetti ama burada çalışan bir şey - ben emekli ve sadece Python öğrenme böylece onunla torunum (12) yardımcı olabilir.

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'de, Python3'te dictionary.iteritems()olduğundan daha verimlidir dictionary.items(), işlevselliği dictionary.iteritems()taşınmıştır dictionary.items()ve iteritems()kaldırılmıştır. Yani bu hatayı alıyorsunuz.

Kullanım dict.items()aynıdır Python3 içinde dict.iteritems()Python2 arasında.


-1

Amacı, .iteritems()döngü sırasında her seferinde bir sonuç vererek daha az bellek alanı kullanmaktı. Neden iteritems()daha verimli olduğu kanıtlanmış olsa da Python 3 sürümünün neden desteklenmediğinden emin değilim.items()

Hem PY sürüm 2 hem de 3'ü destekleyen bir kod eklemek istiyorsanız,

try:
    iteritems
except NameError:
    iteritems = items

Projenizi başka bir sisteme dağıtırsanız ve PY sürümünden emin değilseniz bu yardımcı olabilir.


-1

RafaelC tarafından yanıtlandığı gibi Python 3, dict.iteritems -> dict.items olarak yeniden adlandırıldı. Farklı bir paket sürümü deneyin. Bu mevcut paketleri listeleyecektir:

python -m pip install yourOwnPackageHere==

Ardından, sürümü yüklemek / değiştirmek için == sonrasında deneyeceğiniz sürümle yeniden çalıştırın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.