web-dev-qa-db-ja.com

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

私はNetworkXを使ってShapefileを読み、関数write_shp()を使ってノードとエッジを含むShapefilesを生成しようとしています(/ < - このリンクは死んでいます )しかし、コードを実行しようとすると、次のエラーが表示されます。

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をインストールしました。

このエラーの前に、もう1つ "xrangeは存在しない"というようなものがあるので、調べて、nx_shp.pyファイルでxrangerangeに変更したところ、問題は解決したようです。

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

300
friveraa

Python3を使っているので、dict.items()の代わりにdict.iteritems()を使ってください。

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

Python 3.0 Wiki 組み込みの変更点 の節を見てください。

dict.iteritems()dict.iterkeys()、およびdict.itervalues()を削除しました。

代わりに、それぞれdict.items()dict.keys()、およびdict.values()を使用してください。

648
rafaelc

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

それで彼らはPython2のそれ以降のバージョンでdict.iteritems()を作成しました。これはイテレータオブジェクトを返しました。辞書全体がコピーされなかったため、メモリ消費量が少なくなります。以下のコードで説明されているように、効率を上げるために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()を削除しました。

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

26
Prabhu

私は同様の問題を抱えていて(3.5を使用して)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
Big Daddy

Python2では、dictionary.iteritems()の方がdictionary.items()よりも効率的です。そのため、Python3では、dictionary.iteritems()の機能はdictionary.items()に移行され、iteritems()は削除されました。だから、あなたはこのエラーを受けています。

Python3ではdict.items()を使用してください。これはPython2のdict.iteritems()と同じです。

4
user6802918

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

python -m pip install yourOwnPackageHere==

それから==の後で試すバージョンを再実行してバージョンをインストール/切り替えます。

0
Punnerud

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

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

try:
    iteritems
except NameError:
    iteritems = items

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

0
DivyaMaheswaran