【问题标题】:Iterate through List with range [duplicate]使用范围遍历列表 [重复]
【发布时间】:2020-09-07 22:51:27
【问题描述】:

我对一些 Python 基础知识感到困惑。 我有我的清单:

myList = ['a','b','c','d','e','f']

现在我想使用索引和范围打印这个列表:

for i in range(0, len(myList)):
    print(myList[i])

我明白了:

a
b
c
d
e
f

我的第一个问题:为什么我不应该使用 len(myList)-1? len(myList) 返回 6 但是当我直接使用 print(myList[6]) 时出现超出范围错误。为什么在 for 循环中使用 this 会有所不同?

第二。我知道我可以使用 myList.reverse() 但我想像这样打印反向列表:

for i in range(len(myList), 0, -1):
    print(myList[i])

我超出范围,我应该添加 -1:

for i in range(len(myList)-1, 0, -1):
    print(myList[i])

但在此之后我只得到:

f
e
d
c
b

我的第二个问题:“a”在哪里? ;) 为什么在这个例子中我必须使用 len(myList)-1?

【问题讨论】:

  • range(0, n) 变为 0, 1, 2, .... n-1(n 不包括在内)
  • range(n, 0, -1) 变为 n, n-1, n-2, .... 1(不包括 0)。点是:range 不包括其端点。
  • 请注意,习惯上只使用for element in myList:for element in reversed(myList):。同样,您可以通过打印 i 来检查 range(len(myList)) 和其他元素。
  • len() 函数返回集合中元素的数量。因此,如果您有 6 个元素,则意味着最后一个索引将为 5。这就是您不能使用 myList[6] 的原因

标签: python


【解决方案1】:

注意几点:

  1. Python 是零索引
    这解释了执行myList[6] 时的IndexError,因为最后一个元素是#5 而不是#6。
  2. range(start, stop) 是“前端包含”和“端不包含”
    因此,在迭代时,您打印 myList[0] 而不是 myList[6],这就是为什么您没有在这里得到 IndexError
  3. range(n)
    n 表示执行 for 循环的次数,所以因为你想打印 6 个元素,你应该在没有 -1 的情况下使用 range(len(myList))
  4. range(start, stop, step)
    同样,Python 的 for 循环是“前包含”和“结束独占”,因此您应该从最后一个元素的索引 (len(myList)-1) 开始,并以第一个元素的索引减 1 (-1) 结束。步长可以被认为是迭代时的“位移”,因此在步长为 -1 时,您可以在每个 epoch 将迭代器 i 减一。

希望这有帮助!

【讨论】:

【解决方案2】:

第一个参数是包含的,而第二个参数是排除的。这意味着如果像range(a,b) 这样调用范围函数,它将导致[a,b) 之间的值。因此,当您使用range(0, len(myList)) 时,它会循环通过0..len(myList)-1

正如您现在已经猜到的那样,您需要在以相反顺序循环时减去1,因为数组的最后一个索引是len(myList) -1,而您缺少a,因为不包括0。因此,如果您希望以相反的顺序进行迭代,您可以使用range(len(myList)-1, -1, -1)

【讨论】:

  • 请注意,为了反向迭代range,可以使用reversed(range(len(myList))。这将自动计算一个新的range 并具有适当的界限。
  • 如果你感觉更pythonic,你也可以使用myList[::-1]! :D
  • 列表也有一个优化的反向迭代器,所以reversed(myList)应该是首选。 myList[::-1] 创建一个不必要的副本。
  • @MisterMiyagi:它并没有真正创建副本。切片通常复制对对象的引用,而不是它自己的对象...
【解决方案3】:

首先要知道索引是从0开始而不是1。当你去myList[6]时,首先它不存在,因为索引从0开始。如果你有6个元素,最后一个索引是 5。所以,myList[5] 是 'f'。 现在,range() 的工作原理是,当您将参数指定为 range(0, len(myList)) 时,它会从 0 迭代到 len(myList)-1。它的迭代次数最多比给定的参数少 1。

对于您的第二个问题,您必须再次从 len(myList)-1 开始,因为在您的情况下,最后一个索引是 5。关于 a 在哪里,你必须一直走到 range(len(myList)-1,-1,-1) 直到它上升到第 0 个索引。

【讨论】:

    【解决方案4】:

    第一个问题,为什么:python 是这样工作的,刚开始很奇怪,但当你习惯了它就正常了。 Range[a, b] 给出:a, a+1, a+2, ... b-1(包括第一个参数,不包括最后一个参数)。

    这意味着对于第二个问题,您应该使用:

    for i in range(len(myList)-1, -1, -1):
        print(myList[i])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 2022-10-13
      相关资源
      最近更新 更多