错误:" '字典'对象没有属性' iteritems' "

时间:2015-05-23 23:14:54

标签: python dictionary

我尝试使用NetworkX读取Shapefile并使用函数class NegativeZero: def __index__(self): return 0 def __int__(self): return -1 def __abs__(self): return 0 N = NegativeZero() myList = [0,N,1,-1,2,-2,3,-3] while myList: d = myList.pop() objects[abs(d)] *= sign(int(d)) 生成包含节点和边的Shapefile(在此example 之后< - - 这个链接已经死了),但是当我尝试运行代码时,它会给我以下错误:

write_shp()

我使用Python 3.4并通过pip install安装了NetworkX。

在此错误之前它已经给了我另一个说&#34; xrange不存在&#34;或类似的东西,所以我查了一下,然后在nx_shp.py文件中将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' 更改为xrange,这似乎解决了这个问题。

根据我的阅读,它可能与Python版本有关(Python2与Python3)。

6 个答案:

答案 0 :(得分:651)

在python3中,使用dict.items()代替dict.iteritems()

在python3中删除了

iteritems(),因此您无法再使用此方法了。

查看Python 3.0 Wiki Built-in Changes部分,其中说明了:

  

已移除dict.iteritems()dict.iterkeys()dict.itervalues()

     

相反:使用dict.items()dict.keys()dict.values()   分别

答案 1 :(得分:26)

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(),因为不再需要它。< / p>

您在dict.iteritems()中使用了Python3,因此失败了。尝试使用与dict.items() dict.iteritems()具有相同功能的Python2。这是从Python2Python3的一点点迁移问题。

答案 2 :(得分:5)

我有一个类似的问题(使用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

答案 3 :(得分:4)

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

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

答案 4 :(得分:0)

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

更有效

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

try:
    iteritems
except NameError:
    iteritems = items

如果您将项目部署在其他系统上并且不确定PY版本,则可以提供帮助。

答案 5 :(得分:0)

正如RafaelC回答的那样,Python 3重命名为dict.iteritems-> dict.items。 尝试使用其他软件包版本。这将列出可用的软件包:

python -m pip install yourOwnPackageHere==

然后使用==后尝试安装或切换版本的版本重新运行