如何在python中向后循环? [复制]

Posted

技术标签:

【中文标题】如何在python中向后循环? [复制]【英文标题】:How to loop backwards in python? [duplicate] 【发布时间】:2011-03-29 10:49:01 【问题描述】:

我说的是做类似的事情:

for(i=n; i>=1; --i) 
   //do something with i

我可以想到一些在 python 中这样做的方法(创建range(1,n+1) 的列表并使用while--i 反转它,...)但我想知道是否有更优雅的方法它。有吗?

编辑: 有人建议我使用 xrange() 而不是 range() 因为 range 返回一个列表,而 xrange 返回一个迭代器。但是在 Python 3(我碰巧使用)中,range() 返回一个迭代器并且 xrange 不存在。

【问题讨论】:

回答有点晚了,但是我没有在这里看到最简单的解决方案,所以在这里...... .....................for i in range(n)[::-1] 这将以相反的顺序为您提供i .和平相处。 @ParthikB 反过来最终不会创造额外的空间吗?看起来您正在创建一个新的反向数组 - 我可能错了? 【参考方案1】:

range()xrange() 采用指定步骤的第三个参数。因此,您可以执行以下操作。

range(10, 0, -1)

这给了

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1] 

但对于迭代,您应该真正使用xrange。所以,

xrange(10, 0, -1)

Python 3 用户注意事项:Python 3 中没有单独的 rangexrange 函数,只有 range,它遵循 Python 2 的 xrange 的设计。

【讨论】:

因为这个问题是关于迭代的,所以请使用 xrange 而不是 range (对于小范围并不重要,但对于大范围开始很重要)。 @mzz -- 仅在 Python 2.x 中 我使用 range 只是因为 OP 使用了。 xrangerange 仅适用于真正大范围,例如数百兆字节。此外,在 Python 3.x 中,这种区别消失了。 @Chinmay,为什么不使用您的答案作为向 OP 展示最佳实践的一种方式?没有理由建议使用xrange 我认为你应该使用 range(10, -1, -1) 而不是 range(10, 0, -1)。因为 range(10, 0, -1) 会在索引 0 处停止,因此不会打印索引 0 的值。【参考方案2】:
for x in reversed(whatever):
    do_something()

这基本上适用于所有具有定义顺序的东西,包括xrange 对象和列表。

【讨论】:

意识到 reversed 函数正在返回一个列表。所以 reversed(range(100000)) 将返回包含 100000 个项目的新列表。 @Odomontois,不,它没有。它返回一个迭代器。 @Odomontois:嗯,这是错误的:print reversed([1, 2, 3]) 返回一个<listreverseiterator object at 0xb77f1bec> 是的。对不起。它返回 obj.__reversed__ 方法的结果。因此,默认情况下,生成器对象不像许多其他可迭代对象那样。甚至 reversed(reversed([1,2,3])) 也会引发 TypeError。因此,在许多情况下,例如 reversed([expr(i) for i in iterable if cond(i)]) 发送一些可迭代对象之前,您必须创建一个列表 - 没有括号它会落下。 这应该是imo接受的答案【参考方案3】:

如果输入是字符串,所有这三种解决方案都会给出相同的结果:

1.

def reverse(text):
    result = ""
    for i in range(len(text),0,-1):
        result += text[i-1]
    return (result)

2.

text[::-1]

3.

"".join(reversed(text))

【讨论】:

根据情况推荐哪种方法?【参考方案4】:
def reverse(text):
    reversed = ''
    for i in range(len(text)-1, -1, -1):
        reversed += text[i]
    return reversed

print("reverse(): ".format("abcd", reverse("abcd")))

【讨论】:

【参考方案5】:

要在不使用reversed[::-1] 的情况下反转字符串,请尝试以下操作:

def reverse(text):
    # Container for reversed string
    txet=""

    # store the length of the string to be reversed
    # account for indexes starting at 0
    length = len(text)-1

    # loop through the string in reverse and append each character
    # deprecate the length index
    while length>=0:
        txet += "%s"%text[length]
        length-=1
    return txet

【讨论】:

为什么要这样做?这很简单: def reverse(text): new_text = "" for char in text: new_text = char + new_text return new_text

以上是关于如何在python中向后循环? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 python 列表中向后或向前循环以查找匹配项

如何在 PyCharm 中向后调试?

我将如何在 kivy 中向后发送图像?

如何在Java中向后打印多个字符串

如何在 SQL 中向后运行 UPDATE 命令(最后一条记录到第一条)?

如何在 Python 中向直方图添加特定的 x 刻度线? [复制]