【问题标题】:Get the length of reversed list获取反向列表的长度
【发布时间】:2015-11-20 14:31:10
【问题描述】:

获取反向列表的长度不起作用:

lst = [1,2,3]
lst = reversed(lst)
print len(lst)

抛出TypeError: object of type 'listreverseiterator' has no len()

解决方法是:

lst = [1,2,3]
lst_length = len(lst)
lst = reversed(lst)
print lst_length

# OR
lst = lst[::-1]
print len(lst)

现在我真正的问题是为什么
简单地反转列表不会改变列表的长度,
那么为什么 Python 会抛出这个异常呢?

【问题讨论】:

  • reversed 的结果是一个迭代器;要确定它的长度,你必须消耗它。
  • 您可以改为检查lst.__length_hint__()(尽管并非所有 Python 实现都保证这一点)。
  • 我不明白为什么你需要使用反转来检查列表的长度,反转列表不会改变大小
  • @ajcr 从python3.4+正式添加到PEP 424。添加了 operator.length_hint 函数,因此 operator.length_hint(lst) 应该可以工作,实际上:>>> operator.length_hint(reversed([1,2,3])) 3

标签: python list python-2.7


【解决方案1】:

函数 reversed() 返回一个迭代器,而不是一个实际的列表。 您不能直接获取迭代器的 len() (see here)。 您可以使用扩展切片语法来反转列表:

lst_reversed = lst[::-1]

或将列表倒置:

lst.reverse()

如果你必须使用迭代器,你可以先把它变成一个列表:

lst_reversed = list(reversed(lst))

使用这些方法中的每一种,len() 都会按预期工作。

【讨论】:

  • 调用列表违背了使用reverse的目的
  • 不回答问题(输入:迭代器,输出:长度)
  • 老实说,我不太明白这一点。要准确地反转列表(或任何集合/迭代器),您需要首先迭代它的所有元素,以便您知道从哪里开始反转。这意味着 reversed 的结果已经知道它正在迭代的长度。我认为在实现中将__len__ 方法添加到反转的结果中没有任何危害。我能想到的唯一原因是他们不想欺骗人们认为reversed 给出了一个列表,但 IMO 反转应该只是转换索引的原始数组的镜像。不仅仅是在迭代器中。
【解决方案2】:

reversed 不会产生新的列表,它只是返回迭代器对象。你可以使用 lst.reverse() - 它不返回任何东西,但你的 lst 以相反的顺序进行

【讨论】:

  • 请注意,与 OP 帖子中的其他两种方法相反,这将就地更改列表,因此也会反转对同一列表的任何其他引用。可能不是问题,只是想指出。
  • 我明白了,但是主题启动者想将它重新分配给同一个变量
  • 是的,但是可能other 引用了同一个列表,这些引用意味着要颠倒。在这种情况下,使用lst.reversed() 会导致各种有趣的挠头。正如我所说,这可能不是问题,但值得一提。
【解决方案3】:

reversed 返回迭代器,以便确定您必须使用它的长度。

例如rev_len = len(list(reversed(lst)))

仅供参考list.reverse 方法将列表反转到位:lst.reverse()

无论如何,您的反向列表与原始列表的大小相同,因此您甚至可以在反向之前确定长度。

【讨论】:

  • yes : 将迭代器转换为列表,然后得到长度
  • reversed(lst) 返回一个迭代器,一旦应用 list() 运算符,该迭代器就会“清空”。例如。 l=反转([1,2,3]);打印长度(列表(l));对于 l 中的 p:; print p --> 什么都没有
  • reversed(lst) 返回一个迭代器,而 sorted(lst) 返回一个列表。
猜你喜欢
  • 2022-11-14
  • 1970-01-01
  • 2021-07-25
  • 2019-02-02
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 2017-06-30
  • 2010-11-30
相关资源
最近更新 更多