私は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ファイルでxrange
をrange
に変更したところ、問題は解決したようです。
私が読んだものから、それはPythonのバージョン(Python 2 vs Python 3)に関連している可能性があります。
Python3を使っているので、dict.items()
の代わりにdict.iteritems()
を使ってください。
iteritems()
はpython3で削除されたので、もうこのメソッドを使うことはできません。
Python 3.0 Wiki 組み込みの変更点 の節を見てください。
dict.iteritems()
、dict.iterkeys()
、およびdict.itervalues()
を削除しました。代わりに、それぞれ
dict.items()
、dict.keys()
、およびdict.values()
を使用してください。
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()
を削除しました。
Python3
でdict.iteritems()
を使用したので失敗しました。 Python2
のdict.items()
と同じ機能を持つdict.iteritems()
を使ってみてください。これはPython2
からPython3
へのわずかな移行の問題です。
私は同様の問題を抱えていて(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
Python2では、dictionary.iteritems()
の方がdictionary.items()
よりも効率的です。そのため、Python3では、dictionary.iteritems()
の機能はdictionary.items()
に移行され、iteritems()
は削除されました。だから、あなたはこのエラーを受けています。
Python3ではdict.items()
を使用してください。これはPython2のdict.iteritems()
と同じです。
RafaelCが答えたように、Python 3はdict.iteritems - > dict.itemsと改名しました。別のパッケージバージョンを試してください。利用可能なパッケージが一覧表示されます。
python -m pip install yourOwnPackageHere==
それから==の後で試すバージョンを再実行してバージョンをインストール/切り替えます。
.iteritems()
の目的は、ループ中に一度に1つの結果を出すことによって、より少ないメモリスペースを使用することでした。なぜPython 3バージョンがiteritems()
よりも効率的であることが証明されているのに.items()
をサポートしていないのか、私にはわかりません。
PYバージョン2と3の両方をサポートするコードを含めたい場合は、
try:
iteritems
except NameError:
iteritems = items
他のシステムにプロジェクトをデプロイしていて、PYのバージョンがわからない場合に役立ちます。