エラー:「「dict」オブジェクトには属性「iteritems」がありません」


436

NetworkXを使用してShapefileを読み取り、関数write_shp()を使用してノードとエッジを含むShapefileを生成しようとしていますが、コードを実行しようとすると、次のエラーが発生します。

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を使用しており、pip installでNetworkXをインストールしています。

このエラーが発生する前に、「xrangeは存在しない」などの別のエラーがすでに表示されていたため、それを調べて、nx_shp.pyファイルでに変更xrangerangeただけで、解決したようです。

私が読んだことから、それはPythonバージョン(Python2 vs Python3)に関連している可能性があります。


231
Python 3の名前が変更されましたdict.iteritems -> dict.items
Blender

1
ああ、すごい、今はばかげているように感じます。答えをありがとう
friveraa

6
@ブレンダー:いいえ、名前はに変更さiteritemsれませんでしたitems。前者はイテレータを提供しました(そして3.xにはそのようなメソッドはありません)。後者はビューを提供します(これはとして2.7にバックポートされましたviewitems)。
abarnert 2015年


これは、OPが最初にリンクしたページと同等のページである場合とそうでない場合があります。networkx.github.io
Nathan Arthur

回答:


880

あなたがpython3にいるので、dict.items()代わりにdict.iteritems()

iteritems() はpython3で削除されたため、このメソッドはもう使用できません。

明記されているPython 3.0 Wiki 組み込みの変更セクションをご覧ください。

削除されたdict.iteritems()dict.iterkeys()dict.itervalues()

代わりに:使用dict.items()dict.keys()およびdict.values() それぞれ。


これに関するさらなる議論は、PEP 469に正式に記録されています。推奨されるアプローチiteritemsは、代わりにfuture.utilsまたはsixモジュールの機能を使用することです。
Mack

33

Python2、我々は持っていた.items().iteritems()辞書インチ dict.items()辞書にあるタプルのリストを返しました[(k1,v1),(k2,v2),...]。辞書内のすべてのタプルをコピーし、新しいリストを作成しました。辞書が非常に大きい場合、メモリへの影響が非常に大きくなります。

そのためdict.iteritems()、Python2の新しいバージョンで作成されました。これはイテレータオブジェクトを返しました。辞書全体がコピーされなかったため、メモリ消費が少なくなります。使用Python2する人々は、次のコードで説明するようdict.iteritems().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

出力:

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

python3、彼らはそう移動し、それをより効率的にしたかっdictionary.iteritems()dict.items()、そして取り外し.iteritems()それが不要になったよう。

で使用dict.iteritems()したPython3ので失敗しました。使用してみてくださいdict.items()と同じ機能持っているdict.iteritems()のをPython2。これはからPython2へのわずかな移行の問題Python3です。


5

私は同様の問題(3.5を使用)を抱えていて、1日1/2を失っていましたが、これはうまくいくものです-私は引退し、ちょうどPythonを学んでいるので、孫(12)を助けることができます。

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では、dictionary.iteritems()より効率的であるdictionary.items()のでのpython3での機能は、dictionary.iteritems()に移行されたdictionary.items()iteritems()除去されます。したがって、このエラーが発生しています。

dict.items()Python2と同じPython3で使用しdict.iteritems()ます。


-1

の目的は.iteritems()、ループ中に一度に1つの結果を生成することにより、使用するメモリ領域を少なくすることでした。Python 3バージョンがなぜiteritems()よりも効率的であることが証明されていますが、なぜサポートしていないのかわかりません.items()

PYバージョン2と3の両方をサポートするコードを含める場合

try:
    iteritems
except NameError:
    iteritems = items

これは、プロジェクトを他のシステムにデプロイし、PYバージョンがわからない場合に役立ちます。


-1

RafaelCによる回答のとおり、Python 3はdict.iteritems-> dict.itemsに名前を変更しました。別のパッケージバージョンを試してください。利用可能なパッケージが一覧表示されます。

python -m pip install yourOwnPackageHere==

次に、==の後にインストールする/バージョンを切り替えるために試すバージョンで再実行します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.