【问题标题】:Can you iterate a number backwards without using a list?您可以在不使用列表的情况下向后迭代一个数字吗?
【发布时间】:2011-07-05 09:56:02
【问题描述】:

在 Python 3 中如何在不使用列表的情况下向后迭代一个数字?

使用列表,我可能会这样做:

li = list(range(100))
for i in li[::-1]:
    print(i)

这是一个很好的解决方案,但它不适用于大量数字。 现在,我正在尝试用大数字向后迭代一个数字,但是发生了溢出错误,所以我认为我需要以某种方式找到一种方法来向后迭代一个数字而不使用列表。

有什么办法吗?

【问题讨论】:

  • 谢谢大家,现在我解决了 Project Euler 的问题 3。

标签: python list iteration


【解决方案1】:

提供__reversed__() 特殊方法的迭代器也支持反向迭代。在 Python 3.x 中,range() 迭代器有这个方法,所以你也可以使用

for i in reversed(range(100)):
    print(i)

在 Python 2.x 中,xarnge() 允许反向迭代:

for i in reversed(xrange(100)):
    print i

两个版本都不将整个列表存储在内存中。

【讨论】:

  • +1 正如他们所说,人们每天都会在 SO 上学到新东西。可惜它没有得到广泛的支持。
【解决方案2】:

一般?不,Python 的迭代器协议仅支持前向迭代。(编辑:事实证明这是不正确的,请参阅 Sven Marnach 的回答。)

但是,您可以反转 range(n, m): range(m-1, n-1, -1)(-1 很丑,是的,但这是必要的,因为 range 返回半开范围)。

【讨论】:

  • 感谢您将“-1”添加到 m 和 n 以确保我得到与使用 li[::-1] 相同的结果
  • @John:我建议您改为接受 Sven Marnach 的回答。我的建议过于神秘,而且包含误导性信息。
  • “一般?没有。”仍然是正确的。大多数迭代器不会实现反向迭代协议。
  • @wnoise: reversed 适用于所有序列和其他一些序列(包括大多数可以进行反转的序列),因此 可以在大多数情况下不创建整个列表案例。
【解决方案3】:
for i in range(10,0,-1):
    print(i)

【讨论】:

    【解决方案4】:

    尝试使用范围]然后下级...

    for i in range(100, 0, -1):
    

    [update] 我刚刚注意到你说的是 Python 3,在这种情况下你可以使用 range 而不是 xrange。

    【讨论】:

    • 遗憾的是,反转range 需要更多时间。这是 Python 3,即range = xrange; del xrange
    • @deinan:谢谢,我没有意识到 Python 3 做到了这一点(我真的需要放弃我的 2.7 习惯)。
    • range 实际上比以前的xrange 更像列表(尤其是在 3.2 中)。总体思路还是一样的(即即时计算范围内容,而不是在内存中实现整个序列),但它提供了更多功能(整数的高效包含测试、良好的切片支持、实现序列 ABC、支持大于sys.maxint) 的范围。
    猜你喜欢
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 2015-01-07
    • 2013-12-31
    相关资源
    最近更新 更多