使用Python中的索引向后循环?


286

我正在尝试从100循环到0。如何在Python中执行此操作?

for i in range (100,0) 不起作用。


9
顺便说一句,您可能希望从99循环到0,很少从100循环到0。这会影响答案。
Acumenus

1
@Acumenus这正是我到达这里时所寻找的。为了记录在案,解决方案是简单地编写:(range(100)[::-1]自动翻译成range(9, -1, -1))-在python 3.7中测试
Hassan

Answers:


398

试试看range(100,-1,-1),第三个参数是要使用的增量(在此处记录)。

此处记录 “范围”选项,开始,停止,步骤)


3
另外,我还需要使用它来删除集合中的项目,所以这就是为什么只需要索引的原因。
琼·芬格

2
第二个参数比最终值小一个。因此,如果您输入-1,则范围停止在0;如果您输入-5,则范围停止在-4(递增-1)
mulllhausen 2014年

200

我认为这是最易读的:

for i in reversed(xrange(101)):
    print i,

14
这比接受的答案要好,因为它实际上并未分配内存中的所有数字(在Python 3中,接受的答案也不会),而且更明显的是发生了什么。
Blixt 2012年

5
2.6之前的Python确实分配了所有数字,因为reversed无法告诉xrange向后移动...(自Python 2.6起,它称为__reversed __()。)
Robert Siemer

我喜欢reversed(xrange(len(list)))xrange(len(list)-1:-1:-1); 后者看起来与这么多怪异-1
musiphil 2013年

1
xrange()在Python 3中不再可用
Chris Graf

1
在Python 3中,range其行为与xrange2.7中相同。@hacksoi取决于用例,但假设您要在一个大缓冲区中向后迭代,假设它为10 MB,然后在前面创建反向索引将花费几秒钟,并占用50 MB以上的内存。使用反向生成器将花费毫秒,并且仅占用几个字节的内存。
Blixt

34
for i in range(100, -1, -1)

和一些稍长(且较慢)的解决方案:

for i in reversed(range(101))

for i in range(101)[::-1]

16

通常在Python中,您可以使用负索引从背面开始:

numbers = [10, 20, 30, 40, 50]
for i in xrange(len(numbers)):
    print numbers[-i - 1]

结果:

50
40
30
20
10

8

为什么您的代码不起作用

您的代码for i in range (100, 0)很好,除了

step默认情况下,第三个参数()是+1。因此,必须向range()指定第三个参数才能-1向后退一步。

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

注意:这在输出中包括100&0。

有多种方法。

更好的方法

对于pythonic方式,请检查PEP 0322

这是Python3 pythonic示例,可从100打印到0(包括100和0)。

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

1
是的,PEP-322为我们提供了一种清晰且最少出错的反向迭代方法。
沉艾伦

1
很好 关于如何reversed在PEP-322中实现的建议具有误导性,因此应注意,reversed它将调用__reversed__可迭代并返回结果,对于range对象而言,这是一个延迟评估的range_object迭代器。简而言之:使用这种方法仍然是懒惰的评估。
Ruzihm

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开始。


3

解决您的问题的简单答案可能是这样的:

for i in range(100):
    k = 100 - i
    print(k)


1

简短而甜美。这是我参加codeAcademy课程时的解决方案。以rev顺序打印字符串。

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

1

在您的情况下100 - i,您始终可以增加范围并从变量中减去i in range( 0, 101 )

for i in range( 0, 101 ):
    print 100 - i

0

我在一种代码学院练习中尝试过此操作(在不使用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')


0

哦,好吧,我读错了问题,我想这是关于在数组中向后移动吗?如果是这样,我有这个:

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与初始问题无关。
Michael Doubez

-1

您还可以在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

-2
a = 10
for i in sorted(range(a), reverse=True):
    print i

欢迎使用Stack Overflow!请考虑编辑您的帖子,以添加更多有关代码功能以及为什么它可以解决问题的解释。通常仅包含代码(即使它可以正常工作)的答案通常不会帮助OP理解他们的问题。
SuperBiasedMan

您意识到使用sorted会不必要地将整个列表存储在内存中,对吗?这是浪费的,并且对于大批量生产是不可行的a
Acumenus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.