J'essaie d'utiliser NetworkX pour lire un fichier de formes et utiliser la fonction write_shp()
pour générer les fichiers de formes qui contiendront les nœuds et les bords, mais lorsque j'essaie d'exécuter le code, cela me donne l'erreur suivante:
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 l'installation de pip.
Avant cette erreur, il m'en avait déjà donné un autre qui disait "xrange n'existe pas" ou quelque chose comme ça, alors je l'ai recherché et je suis passé xrange
au range
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).
python
python-3.x
dictionary
friveraa
la source
la source
dict.iteritems -> dict.items
.iteritems
àitems
. Le premier vous a donné un itérateur (et 3.x n'a pas une telle méthode); ce dernier vous donne une vue (qui a été rétroportée à 2,7 commeviewitems
).Réponses:
Comme vous êtes en python3, utilisez
dict.items()
au lieu dedict.iteritems()
iteritems()
a été supprimé en python3, vous ne pouvez donc plus utiliser cette méthode.Jetez un oeil à la section Python 3.0 Wiki Built-in Changes , où il est indiqué:
la source
iteritems
fonction des modulesfuture.utils
ousix
.En Python2 , nous avions
.items()
et.iteritems()
dans les dictionnaires.dict.items()
a renvoyé la liste des tuples dans le dictionnaire[(k1,v1),(k2,v2),...]
. Il a copié tous les tuples dans le dictionnaire et créé une nouvelle liste. Si le dictionnaire est très volumineux, la mémoire a un impact très important.Ils ont donc créé
dict.iteritems()
dans les versions ultérieures de Python2. Cela a renvoyé l'objet itérateur. Le dictionnaire entier n'a pas été copié, ce qui réduit la consommation de mémoire. Les personnes utilisantPython2
sont enseignées à utiliserdict.iteritems()
plutôt qu'à des.items()
fins d'efficacité comme expliqué dans le code suivant.Production:
En Python3 , ils voulaient le rendre plus efficace, donc déplacé
dictionary.iteritems()
versdict.items()
et supprimé.iteritems()
car il n'était plus nécessaire.Vous avez utilisé
dict.iteritems()
enPython3
sorte qu'il a échoué. Essayez d' utiliserdict.items()
qui a la même fonctionnalité quedict.iteritems()
dePython2
. Il s'agit d'un petit problème de migration dePython2
versPython3
.la source
J'ai eu un problème similaire (en utilisant 3.5) et y ai perdu une demi-journée mais voici quelque chose qui fonctionne - je suis à la retraite et j'apprends juste Python afin que je puisse aider mon petit-fils (12) avec.
la source
En Python2,
dictionary.iteritems()
est plus efficace qu'endictionary.items()
Python3, la fonctionnalité dedictionary.iteritems()
a été migrée versdictionary.items()
etiteritems()
est supprimée. Vous obtenez donc cette erreur.Utilisation
dict.items()
en Python3 qui est identique àdict.iteritems()
Python2.la source
Le but de
.iteritems()
était d'utiliser moins d'espace mémoire en produisant un résultat à la fois lors de la boucle. Je ne sais pas pourquoi la version Python 3 ne prend pas en chargeiteritems()
bien qu'elle se soit avérée efficace que.items()
Si vous souhaitez inclure un code qui prend en charge les versions PY 2 et 3,
Cela peut être utile si vous déployez votre projet dans un autre système et que vous n'êtes pas sûr de la version PY.
la source
Comme l'a répondu RafaelC, Python 3 a renommé dict.iteritems -> dict.items. Essayez une autre version de package. Cette liste répertorie les packages disponibles:
Ensuite, réexécutez avec la version que vous allez essayer après == pour installer / changer de version
la source