【问题标题】:How can I use enumerate to count backwards?如何使用 enumerate 倒数?
【发布时间】:2018-10-27 04:00:12
【问题描述】:
letters = ['a', 'b', 'c']

假设这是我的清单。 for i, letter in enumerate(letters) 在哪里:

0, a
1, b
2, c

我怎样才能让它向后枚举,如:

2, a
1, b
0, c

【问题讨论】:

  • 试试:for i, letter in reversed(list(enumerate(reversed(letters))))
  • @davedwards 链接的答案并未准确输出 OP 想要的内容。
  • @VivekPabani,真的!谢谢 Vivek ;-)
  • 你可以自己写函数; enumerate 实际上只是 python 中的 4 行代码。稍微调整一下就可以了 - docs.python.org/3/library/functions.html#enumerate

标签: python python-3.x


【解决方案1】:

这是一个很好的解决方案,而且效果很好:

items = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
for idx, item in enumerate(items, start=-len(items)):
    print(f"reverse index for {item}: {abs(idx)}")

这里是上面sn-p的OUTPUT

reverse index for a: 7
reverse index for b: 6
reverse index for c: 5
reverse index for d: 4
reverse index for e: 3
reverse index for f: 2
reverse index for g: 1

这是上面 sn-p 中发生的事情:

  • enumeratestart arg 被赋予负值。
  • enumerate 总是向前迈出一步。
  • 最后,我们在idx 上使用abs 来求绝对值,该绝对值始终为正。
  • 如果您想从零开始索引,请使用 -len(items) + 1 修复 off-by-one 错误

【讨论】:

  • 这比公认的答案更容易理解和现实。
  • 我会使用-1 * idx 而不是调用abs()
【解决方案2】:

试试这个:

letters = ['a', 'b', 'c']
for i, letter in reversed(list(enumerate(reversed(letters)))):
    print(i, letter)

输出:

2 a
1 b
0 c

【讨论】:

  • 这个答案有O(n)空间复杂度,因为list()enumerate()返回的生成器创建了一个新列表。
【解决方案3】:

试试这个:

l = len(letters)
for i, letter in enumerate(letters):
    print(l-i, letters)

【讨论】:

  • IMO 这比负索引好。
【解决方案4】:

我会先尝试做一个反向列表,然后你可以使用enumerate()

letters = ['a', 'b', 'c']
letters.reverse()
for i, letter in enumerate(letters)

【讨论】:

    【解决方案5】:

    zip 函数为两个参数列表创建一个元素对列表。

    list(zip([i for i in range(len(letters))][::-1], letters))
    

    【讨论】:

      【解决方案6】:
      letters = ['a', 'b', 'c']
      
      for i, letter in zip(range(len(letters)-1, -1, -1), letters):
          print(i, letter)
      

      打印

      2 a
      1 b
      0 c
      

      取自类似问题的答案:Traverse a list in reverse order in Python

      【讨论】:

        【解决方案7】:

        tl;dr: 大小 - 索引 - 1

        我假设您要问的问题是您是否可以在项目相同时反转索引,例如,当实际索引为 0 时,a 的排序号为 2。

        要计算这一点,请考虑数组或列表中的每个元素都希望项目的索引与集合末尾的“距离”(索引方式)相同。计算这个给你大小 - 索引。

        但是,许多编程语言以索引 0 开始数组。因此,我们需要减 1 以使索引正确对应。考虑我们的最后一个元素,索引为 size - 1。在我们的原始方程中,我们将得到 size - (size - 1),它等于 size - size + 1,等于 1。因此,我们需要减 1。

        最终方程(对于每个元素):大小 - 索引 - 1

        【讨论】:

          【解决方案8】:

          我们可以定义效用函数(在Python3.3+中)

          from itertools import count
          
          
          def enumerate_ext(iterable, start=0, step=1):
              indices = count(start, step)
              yield from zip(indices, iterable)
          

          并像直接使用它

          letters = ['a', 'b', 'c']
          for index, letter in enumerate_ext(letters,
                                             start=len(letters) - 1,
                                             step=-1):
              print(index, letter)
          

          或者写助手

          def reverse_enumerate(sequence):
              yield from enumerate_ext(sequence,
                                       start=len(sequence) - 1,
                                       step=-1)
          

          并像使用它

          for index, letter in reverse_enumerate(letters):
              print(index, letter)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-15
            • 2020-11-12
            • 2011-06-22
            • 1970-01-01
            • 2015-03-28
            • 1970-01-01
            相关资源
            最近更新 更多