使用Python中的索引向后循环?
Posted
技术标签:
【中文标题】使用Python中的索引向后循环?【英文标题】:Loop backwards using indices in Python? 【发布时间】:2010-10-26 13:47:01 【问题描述】:我正在尝试从 100 循环到 0。如何在 Python 中执行此操作?
for i in range (100,0)
不起作用。
【问题讨论】:
顺便说一句,您可能希望从 99 循环到 0,而很少从 100 循环到 0。这会影响答案。 @Acumenus 这正是我到达这里时搜索的内容。为了记录,解决方案是简单地写:range(100)[::-1]
(自动翻译为range(9, -1, -1)
)-在python 3.7中测试
【参考方案1】:
尝试range(100,-1,-1)
,第三个参数是要使用的增量(记录在here)。
(“范围”选项,开始、停止、步骤记录在案here)
【讨论】:
我还需要使用它从集合中删除项目,所以这就是为什么只需要索引。 第二个参数比最终值小一。因此,如果您输入 -1,则范围停止在 0,如果输入 -5,则范围停止在 -4(增量为 -1)【参考方案2】:for i in range(100, -1, -1)
还有一些稍长(更慢)的解决方案:
for i in reversed(range(101))
for i in range(101)[::-1]
【讨论】:
【参考方案3】:在我看来,这是最易读的:
for i in reversed(xrange(101)):
print i,
【讨论】:
这比接受的答案要好,因为它实际上并没有分配内存中的所有数字(在 Python 3 中接受的答案也不会),而且发生的事情更明显。跨度> 2.6 之前的 Python 确实分配了所有数字,因为 reversed 无法告诉 xrange 向后退...(从 Python 2.6 开始,它调用 __reversed__()。) 比起xrange(len(list)-1:-1:-1)
,我更喜欢reversed(xrange(len(list)))
;后者看起来很奇怪,有这么多-1
。
xrange() 在 Python 3 中不再可用
在 Python 3 中,range
的行为方式与 xrange
在 2.7 中的行为方式相同。 @hacksoi 取决于用例,但假设您在一个大缓冲区中向后迭代,假设它是 10 MB,然后预先创建反向索引需要几秒钟并用完超过 50 MB 的内存。使用反向生成器需要几毫秒,并且只占用几个字节的内存。【参考方案4】:
一般在Python中,可以使用负索引从后面开始:
numbers = [10, 20, 30, 40, 50]
for i in xrange(len(numbers)):
print numbers[-i - 1]
结果:
50
40
30
20
10
【讨论】:
【参考方案5】:另一种解决方案:
z = 10
for x in range (z):
y = z-x
print y
结果:
10
9
8
7
6
5
4
3
2
1
提示: 如果您使用此方法对列表中的索引进行倒数计数,则需要从“y”值开始 -1,因为您的列表索引将从 0 开始。
【讨论】:
【参考方案6】:for var in range(10,-1,-1)
有效
【讨论】:
【参考方案7】:我在一个 codeacademy 练习中尝试过这个(在不使用 reversed 或 ::-1 的情况下反转字符串中的字符)
def reverse(text):
chars= []
l = len(text)
last = l-1
for i in range (l):
chars.append(text[last])
last-=1
result= ""
for c in chars:
result += c
return result
print reverse('hola')
【讨论】:
【参考方案8】:短而甜。这是我在做 codeAcademy 课程时的解决方案。以 rev 顺序打印字符串。
def reverse(text):
string = ""
for i in range(len(text)-1,-1,-1):
string += text[i]
return string
【讨论】:
【参考方案9】:a = 10
for i in sorted(range(a), reverse=True):
print i
【讨论】:
欢迎来到 Stack Overflow!请考虑编辑您的帖子,以添加更多关于您的代码的作用以及它为什么会解决问题的解释。一个大部分只包含代码的答案(即使它正在工作)通常不会帮助 OP 理解他们的问题。 您意识到使用sorted
会不必要地将整个列表存储在内存中,对吧?这很浪费,对于大型a
是不可行的。【参考方案10】:
为什么您的代码不起作用
你的代码for i in range (100, 0)
很好,除了
第三个参数(step
)默认为+1
。因此,您必须将 range() 的第三个参数指定为 -1
才能后退。
for i in range(100, -1, -1):
print(i)
注意:这包括输出中的 100 和 0。
有多种方法。
更好的方法
对于pythonic方式,请查看PEP 0322。
这是从 100 打印到 0(包括 100 和 0)的 Python3 pythonic 示例。
for i in reversed(range(101)):
print(i)
【讨论】:
是的,PEP-322 为我们提供了一种清晰且不易出错的反向迭代方法。 这很好。关于如何在 PEP-322 中实现reversed
的建议具有误导性,因此应该注意 reversed
将在可迭代对象上调用 __reversed__
并返回结果,而对于 range
对象,这是一个惰性求值的 @ 987654332@ 迭代器。简而言之:使用这种方法仍然是惰性求值。【参考方案11】:
在您的情况下,您始终可以增加范围并从变量中减去 100 - i
其中i in range( 0, 101 )
。
for i in range( 0, 101 ):
print 100 - i
【讨论】:
【参考方案12】:解决您的问题的简单答案可能是这样的:
for i in range(100):
k = 100 - i
print(k)
【讨论】:
【参考方案13】:我想同时向后循环两个列表,所以我需要负索引。这是我的解决方案:
a= [1,3,4,5,2]
for i in range(-1, -len(a), -1):
print(i, a[i])
结果:
-1 2
-2 5
-3 4
-4 3
-5 1
【讨论】:
【参考方案14】:哦,好吧,问题看错了,我想这是关于在数组中倒退?如果是这样,我有这个:
array = ["ty", "rogers", "smith", "davis", "tony", "jack", "john", "jill", "harry", "tom", "jane", "hilary", "jackson", "andrew", "george", "rachel"]
counter = 0
for loop in range(len(array)):
if loop <= len(array):
counter = -1
reverseEngineering = loop + counter
print(array[reverseEngineering])
【讨论】:
您的答案似乎是您所做的测试的复制粘贴。请尝试发布一个最小示例:global
和 time
的使用与初始问题无关。【参考方案15】:
您还可以在 python 中创建自定义反向机制。可以在任何地方使用它来向后循环迭代
class Reverse:
"""Iterator for looping over a sequence backwards"""
def __init__(self, seq):
self.seq = seq
self.index = len(seq)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
self.index -= 1
return self.seq[self.index]
>>> d = [1,2,3,4,5]
>>> for i in Reverse(d):
... print(i)
...
5
4
3
2
1
【讨论】:
【参考方案16】:您可能想在 python 中使用reversed
函数。
在我们进入代码之前,我们必须记住range
函数总是返回一个列表(或我不知道的元组),所以range(5)
将返回[0, 1, 2, 3, 4]
。 reversed
函数反转一个列表或一个元组,所以 reversed(range(5))
将是 [4, 3, 2, 1, 0]
所以你的解决方案可能是:
for i in reversed(range(100)):
print(i)
【讨论】:
【参考方案17】:它很适合我
for i in range(5)[::-1]:
print(i,end=' ')
输出:4 3 2 1 0
【讨论】:
以上是关于使用Python中的索引向后循环?的主要内容,如果未能解决你的问题,请参考以下文章