我正在尝试使用 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_shp.py 文件中将 xrange
更改为 range
,这似乎解决了它.
根据我的阅读,它可能与 Python 版本(Python2 与 Python3)有关。
dict.iteritems -> dict.items
。
iteritems
重命名为 items
。前者给了你一个迭代器(而 3.x 没有这样的方法);后者为您提供了一个视图(作为 viewitems
向后移植到 2.7)。
正如您在 python3 中一样,使用 dict.items()
而不是 dict.iteritems()
iteritems()
已在 python3 中删除,因此您不能再使用此方法。
查看 Python 3.0 Wiki Built-in Changes 部分,其中说明:
删除了 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.iteritems()
具有相同功能的 dict.items()
。这是从 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()
相同。
.iteritems()
的目的是通过在循环时一次产生一个结果来使用更少的内存空间。我不确定为什么 Python 3 版本不支持iteritems()
,尽管它已被证明比 .items()
有效
如果要包含同时支持 PY 版本 2 和 3 的代码,
try:
iteritems
except NameError:
iteritems = items
如果您在其他系统中部署项目并且不确定 PY 版本,这会有所帮助。
正如 RafaelC 所回答的,Python 3 重命名了 dict.iteritems -> dict.items。尝试不同的软件包版本。这将列出可用的软件包:
python -m pip install yourOwnPackageHere==
然后使用您将在 == 之后尝试的版本重新运行以安装/切换版本
future.utils
或six
模块的iteritems
函数。