web-dev-qa-db-fra.com

Erreur: "l'objet 'dict' n'a pas d'attribut 'iteritems'"

J'essaie d'utiliser NetworkX pour lire un fichier de forme et la fonction write_shp() pour générer les fichiers de forme qui contiendront les nœuds et les arêtes, mais lorsque j'essaie d'exécuter le code, l'erreur suivante s'affiche:

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'

J'utilise Python 3.4 et j'ai installé NetworkX via pip install.

Avant cette erreur, il m'en avait déjà donné une autre qui disait "xrange n'existe pas" ou quelque chose du genre, alors je l'ai vérifiée et j'ai juste changé xrange en range dans le fichier nx_shp.py, qui semblait le résoudre.

D'après ce que j'ai lu, cela pourrait être lié à la version Python (Python2 vs Python3).

333
friveraa

Comme vous êtes dans python3, utilisez dict.items() au lieu de dict.iteritems()

iteritems() a été supprimé de python3, vous ne pouvez donc plus utiliser cette méthode.

Jetez un coup d'œil à la section Python 3.0 Wiki Modifications intégrées , où il est indiqué:

Suppression de dict.iteritems(), dict.iterkeys() et dict.itervalues().

Au lieu de cela: utilisez dict.items(), dict.keys() et dict.values() respectivement.

713
rafaelc

Dans Python2, nous avions .items() et .iteritems() dans les dictionnaires. dict.items() a retourné la liste des n-uplets du dictionnaire [(k1,v1),(k2,v2),...]. Il a copié tous les tuples du dictionnaire et créé une nouvelle liste. Si le dictionnaire est très volumineux, l'impact sur la mémoire est très important.

Ils ont donc créé dict.iteritems() dans les versions ultérieures de Python2. Cet objet itérateur est retourné. Le dictionnaire entier n’a pas été copié, ce qui réduit la consommation de mémoire. Les personnes utilisant Python2 apprennent à utiliser dict.iteritems() au lieu de .items() pour plus d'efficacité, comme expliqué dans le code suivant.

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

Sortie:

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

Dans Python, ils voulaient le rendre plus efficace. dictionary.iteritems() a donc été déplacé vers dict.items() et supprimé .iteritems(), car il n'était plus nécessaire.

Vous avez utilisé dict.iteritems() dans Python3 et l'échec a donc eu lieu. Essayez d’utiliser dict.items(), qui a les mêmes fonctionnalités que dict.iteritems() sur Python2. Il s'agit d'un petit problème de migration de Python2 à Python3.

28
Prabhu

J'ai eu un problème similaire (avec 3,5) et j'ai perdu une demi-journée, mais voici quelque chose qui fonctionne: je suis à la retraite et je viens d'apprendre Python pour pouvoir aider mon petit-fils (12) à le faire .

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
Big Daddy

En Python2, dictionary.iteritems() est plus efficace que dictionary.items(). En Python3, la fonctionnalité de dictionary.iteritems() a été migrée vers dictionary.items() et iteritems() est supprimée. Donc, vous obtenez cette erreur.

Utilisez dict.items() dans Python3, qui est identique à dict.iteritems() de Python2.

4
user6802918

Comme l'a répondu RafaelC, Python 3 a été renommé dict.iteritems -> dict.items. Essayez une autre version du paquet. Ceci listera les paquets disponibles:

python -m pip install yourOwnPackageHere==

Puis relancez avec la version que vous allez essayer après == d'installer/changer de version

0
Punnerud

Le but de .iteritems() était d’utiliser moins d’espace mémoire en générant un résultat à la fois tout en boucle. Je ne suis pas sûr de savoir pourquoi la version Python 3 ne prend pas en charge la fonction iteritems() alors que son efficacité s'est avérée supérieure à celle de .items()

Si vous souhaitez inclure un code prenant en charge à la fois les versions 2 et 3 de PY,

try:
    iteritems
except NameError:
    iteritems = items

Cela peut aider si vous déployez votre projet dans un autre système et que vous n'êtes pas sûr de la version PY.

0
DivyaMaheswaran