如何在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 中没有单独的
range
和xrange
函数,只有range
,它遵循 Python 2 的xrange
的设计。
【讨论】:
因为这个问题是关于迭代的,所以请使用 xrange 而不是 range (对于小范围并不重要,但对于大范围开始很重要)。 @mzz -- 仅在 Python 2.x 中 我使用range
只是因为 OP 使用了。 xrange
与 range
仅适用于真正大范围,例如数百兆字节。此外,在 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中向后循环? [复制]的主要内容,如果未能解决你的问题,请参考以下文章