【问题标题】:Error: " 'dict' object has no attribute 'iteritems' "错误:“‘dict’对象没有属性‘iteritems’”
【发布时间】:2015-08-05 18:17:41
【问题描述】:

我正在尝试使用 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)有关。

【问题讨论】:

标签: python python-3.x dictionary


【解决方案1】:

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

python -m pip install yourOwnPackageHere==

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

【讨论】:

    【解决方案2】:

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

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

    try:
        iteritems
    except NameError:
        iteritems = items
    

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

    【讨论】:

      【解决方案3】:

      在 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() 分别。

      【讨论】:

      • 对此的进一步讨论正式记录在PEP 469。推荐的方法似乎是使用 future.utilssix 模块的 iteritems 函数。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          我遇到了类似的问题(使用 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
          

          【讨论】:

            猜你喜欢
            • 2016-08-25
            • 1970-01-01
            • 2012-10-30
            • 2016-09-23
            • 1970-01-01
            • 1970-01-01
            • 2022-10-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多