【问题标题】:Loop backwards using indices in Python?使用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中测试

标签: python loops


【解决方案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

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2012-11-23
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2020-09-09
                          • 1970-01-01
                          相关资源
                          最近更新 更多