【问题标题】:How to start from second index for for-loop如何从 for 循环的第二个索引开始
【发布时间】:2018-12-04 21:29:04
【问题描述】:

我有这个 for 循环。我希望i in range(nI)I 列表中的第二个数字开始。你能指导我吗?

I=[0,1,2,3,4,5,6]
nI=len(I)
for i in range(nI):
    sum=0
    for v in range(nV):
        for j in range(nJ):
            sum=sum+x1[i][j][v]
return sum

【问题讨论】:

    标签: python python-3.x numpy


    【解决方案1】:

    首先要记住,python 使用零索引。

    除了使用 range 函数获取所需项目的索引或使用切片获取元素之外,您可以遍历列表。

    我认为在这里变得令人困惑的是,在您的示例中,值和索引是相同的,因此为了澄清,我将使用此列表作为示例:

    I = ['a', 'b', 'c', 'd', 'e']
    nI = len(I) # 5
    

    范围函数将允许您遍历索引:

    for i in range(1, nI):
        print(i)
    # Prints:
    # 1
    # 2
    # 3
    # 4
    

    如果你想使用 range 函数访问值,你应该这样做:

    for index in range(1, nI):
        i = I[index]
        print(i)
    # Prints:
    # b
    # c
    # d
    # e
    

    你也可以使用数组切片来做到这一点,你甚至不需要nI。数组切片返回一个带有切片的新数组。
    切片使用the_list_reference[start:end:steps] 完成,其中所有三个参数都是可选的,并且:
    start 是第一个包含在切片中的索引
    end 是第一个要排除的元素的索引从切片
    steps 是从(如预期的那样)start 开始的每个下一个索引的步数(如果 steps 是 2 并从 1 开始,它会得到每个奇数索引)。
    示例:

    for i in I[1:]:
        print(i)
    # Prints:
    # b
    # c
    # d
    # e
    

    【讨论】:

      【解决方案2】:

      你可以简单地使用切片:

      for item in I[1:]:
          print(item)
      

      如果你想要索引,使用pythonic风格的enumerate:

      START = 1
      for index, item in enumerate(I[START:], START):
          print(item, index)
      

      【讨论】:

      • 很好 :) 您使用 Python 和 C# 样式 forEach 而不是带有 Range 语句的 c++ 样式 For 保存。
      【解决方案3】:

      如果你想从第二个项目迭代列表,只需使用range(1, nI)(如果 nI 是列表的长度左右)。

      for i in range(1, nI):
          sum=0
          for v in range(nV):
              for j in range(nJ):
                  sum=sum+x1[i][j][v]
      

      可能,您的函数的一部分只是丢失了某个地方,但无论如何,通常 range() 的工作方式如下:

      range(start_from, stop_at, step_size)
      

      我。 e.

      for i in range(2, 7, 2):
          print(i, end=' ')
      
      Out:
      2 4 6
      

      编辑

      请记住:python 使用零索引,即第一个元素的索引为 0,第二个元素的索引为 1,依此类推。

      默认情况下,range 从 0 开始,并在传递参数的值减一时停止。 如果有显式 start,则迭代从它的值开始。如果有 步骤,它会继续,而 range 返回值小于 停止值。

      for i in range(1, 7, 2):
          print(i, end=' ')
      
      Out: 
      1 3 5  # there's no 7!
      

      range 内置的详细描述是here

      【讨论】:

      • 我的范围是 I=5 但我想跳过这个范围内的 1 并从这个范围内的 i=2 开始
      • 您可以编辑您的帖子并添加您的代码 sn-p 的缺失部分吗?猜猜不用range 也可以只用切片来解决它。
      • 我做到了。我希望我从列表中的 1 开始。我的 for 循环不想要 0
      【解决方案4】:

      如果没有另外指定,范围从 0 索引开始。你想使用类似的东西

      for i in range(1,nI):
          ...
      

      【讨论】:

      • 我的范围是 5 但我想从这个范围跳过 1 并从这个范围内的 i=2 开始
      • 那么您想获得列表中的第二至第五项吗?
      • 我希望我的 for 循环获取列表中第二个值的索引并进行迭代以结束
      • 我想要这样的东西:for i+1 in range(n)
      【解决方案5】:
      • 您应该避免使用内置函数的名称。如果确实必须,请在末尾添加下划线,例如sum_,但这可能暗示您应该使用内置函数。
      • 对于迭代变量,建议您使用i, j, k, m, n,除非您有理由将其命名为其他名称。
      • 如果您使用的是 numpy 数组,您可以使用 for value in np.nditer(...) 遍历所有值
      • 如果您将 sum = 0 放入循环中,那么它每次都会重置为该值。
      • 您可以使用 itertools.product 例如“取消嵌套”for 循环
      sum(x[i][j][v] for i, j, v in itertools.product(range(nI), range(nJ), range(nV))) 
      
      • 为了减少多个 for 循环,Itertools 有一个产品功能,它为您提供了一个生成器,允许您将多个可迭代对象扁平化为一个可迭代的元组,这实际上与嵌套的 for 循环相同。唯一的区别是值的顺序。
      from itertools import product
      
      for x, y in product(range(3), range(4, 7)):
          print(x, y)
      
      0 4
      0 5
      0 6
      1 4
      1 5
      1 6
      2 4
      2 5
      2 6
      
      [Program finished]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多