【问题标题】:Reversed OrderedDict TypeError反转 OrderedDict 类型错误
【发布时间】:2017-08-06 11:48:12
【问题描述】:

我有一个有序的字典,我试图以相反的顺序浏览它,基本上从插入的最后一个(键,值)开始。

dicts = OrderedDict()
...
for key, value in reversed(dicts.items()):

当我将 PyCharm 与 Python 3.5.1 一起使用时,上面的代码工作正常,但是当我将它放在代码战上时,使用他们的 Python 3 解释器(不确定确切的版本),我得到以下 for 循环实现的错误:

TypeError: argument to reversed() must be a sequence

为什么会发生这个错误,我该如何解决?

【问题讨论】:

  • 我相信dicts.items() 必须被强制转换为列表甚至元组。

标签: python python-3.x dictionary reverse


【解决方案1】:

根据the docsOrderedDict.items() 仅支持从 3.5 开始的reversed,所以我预计它是旧版本。

您可以修复它的一种方法是先转换为列表:

for key, value in reversed(list(dicts.items())):
     ...

NB:根据 cmets,dicts.items() 应该是内存效率高的,但 list(dicts.items()) 肯定会创建一个长度为 dicts 中的项目数的新列表。大多数时候这应该没问题,但是对于非常大的dicts,这将看到 O(N) 的内存使用量,这可能很重要。

【讨论】:

  • 让它在旧版本上工作的最佳方法是什么?
  • list 转换的内存效率是否低于dicts.items() 调用? dicts.items() 不像是一个生成器
  • @Chris_Rands 在 python3 中dicts.items() 返回一个dictionary view object,这是内存高效的。 listing 它会在内存中创建项目的副本。另见:stackoverflow.com/a/8960727/3901060
  • 所以,鉴于@FamousJameous 所说,它确实使用(可能很多)更多内存。也许您应该“取消划痕”您的评论...
猜你喜欢
  • 1970-01-01
  • 2018-10-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 2021-08-05
  • 1970-01-01
相关资源
最近更新 更多