错误:“& # 39; dict # 39;对象没有属性'“;

我试图使用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_sh .py文件中将xrange改为range,这似乎解决了这个问题。

据我所知,它可能与Python版本(Python2 vs Python3)有关。

574381 次浏览

在python3中,使用dict.items()而不是dict.iteritems()

iteritems()在python3中被删除,所以你不能再使用这个方法了。

看一看Python 3.0 Wiki 内置的变化部分,它是这样说的:

删除dict.iteritems()dict.iterkeys()dict.itervalues()

相反:使用dict.items()dict.keys()dict.values() 分别。< / p >

我也遇到过类似的问题(使用3.5),每天损失1/2天,但这里有一个有效的方法——我退休了,正在学习Python,这样我就可以帮助我的孙子(12岁)学习Python。

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中,字典中有.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(),所以它失败了。尝试使用dict.items(),它具有与Python2dict.iteritems()相同的功能。这是一个从Python2Python3的小迁移问题。

在Python2中,dictionary.iteritems()dictionary.items()更有效,因此在Python3中,dictionary.iteritems()的功能被迁移到dictionary.items()iteritems()被删除。所以你会得到这个错误。

在Python3中使用dict.items(),这与Python2中的dict.iteritems()相同。

.iteritems()的目的是通过在循环时每次产生一个结果来使用更少的内存空间。我不确定为什么Python 3版本不支持# eyz1,尽管它已经被证明比.items()更有效

如果你想包含一个同时支持PY版本2和3的代码,

try:
iteritems
except NameError:
iteritems = items

如果您将项目部署在其他系统中,并且不确定PY版本,这将有所帮助。

由RafaelC回答,Python 3重命名dict。Iteritems -> dict.items。 尝试不同的软件包版本。这将列出可用的包:

python -m pip install yourOwnPackageHere==

然后重新运行==后要尝试的版本来安装/切换版本