使用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])

【讨论】:

您的答案似乎是您所做的测试的复制粘贴。请尝试发布一个最小示例:globaltime 的使用与初始问题无关。【参考方案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中的索引向后循环?的主要内容,如果未能解决你的问题,请参考以下文章

为啥循环在这里比索引好?

如何防止熊猫数据框中的索引出现在excel中?

如何在循环中将记录插入表中?

Python——用for循环删除列表中的元素

Python中的循环

如何只对python循环中的第一项做某事?