关于python:错误:“’dict’对象没有属性’iteritems’”

Error: “ 'dict' object has no attribute 'iteritems' ”

我试图使用networkx读取一个shapefile,并使用函数write_shp()生成将包含节点和边的shapefile(以下示例<--此链接现已失效),但当我尝试运行代码时,它会给出以下错误:

1
2
3
4
5
6
7
8
9
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
etworkx
eadwrite
x_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安装安装了networkx。

在这个错误之前,它已经给了我另一个说"xrange不存在"或类似的错误,所以我查找了它,并在nx-shp.py文件中将xrange更改为range,这似乎解决了它。

从我读到的内容来看,它可能与Python版本(python2与python3)有关。


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

在python3中删除了iteritems(),因此您不能再使用此方法。

看看python 3.0 wiki内置的changes部分,其中说明了:

Removed dict.iteritems(), dict.iterkeys(), and dict.itervalues().

Instead: use dict.items(), dict.keys(), and dict.values()
respectively.


在python2,字典中有.items().iteritems()dict.items()返回字典[(k1,v1),(k2,v2),...]中的元组列表。它复制了字典中的所有元组并创建了新列表。如果字典很大,则会有很大的内存影响。

所以他们在后来的python2版本中创建了dict.iteritems()。这返回了迭代器对象。整个词典没有被复制,因此内存消耗较少。为了提高效率,教育使用Python2的人使用dict.iteritems(),而不是使用.items(),如下代码所述。

1
2
3
4
5
6
7
8
9
10
11
12
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

输出:

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

在python3,他们想提高效率,于是把dictionary.iteritems()移到dict.items()上,把不再需要的.iteritems()移走。

你在Python3中使用了dict.iteritems(),所以失败了。尝试使用与Python2dict.iteritems()功能相同的dict.items()。这是一个从Python2Python3的微小迁移问题。


我也遇到过类似的问题(使用3.5),每天损失1/2的时间,但这里有一件事是可行的——我退休了,只是在学习python,所以我可以帮助我的孙子(12)。

1
2
3
4
5
6
7
8
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()被删除。所以你得到了这个错误。

在肾盂3中使用dict.items(),与肾盂2的dict.iteritems()相同。


正如拉斐尔所回答的,python 3重命名了dict.iteritems->dict.items。尝试其他包版本。这将列出可用的包:

1
python -m pip install yourOwnPackageHere==

然后用您将在==之后尝试的版本重新运行以安装/切换版本


.iteritems()的目的是通过在循环时一次生成一个结果来减少内存空间的使用。我不知道为什么python 3版本不支持iteritems(),尽管事实证明它比.items()有效。

如果要包含同时支持PY版本2和3的代码,

1
2
3
4
try:
    iteritems
except NameError:
    iteritems = items

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