代码之家  ›  专栏  ›  技术社区  ›  trystuff

以变量步骤遍历数组或列表

  •  0
  • trystuff  · 技术社区  · 6 年前

    我正在尝试找出如何在变量步骤中循环遍历数组或列表。

    例如,如果我有以下列表…

    a = [0,0,1,0,0,1,0]
    

    …并希望使用以下逻辑:

    • 从索引0开始

    • 如果索引两个点的距离为0,则移动两个点

    • 如果两个点之间的索引为1,则移动一个点

      但是,我不太清楚如何实现这个逻辑,因为看起来我无法更改我所遍历的索引值。

    为什么此代码段仍然返回0-6而不是0,3,6的值?

    for idx,val in enumerate(a):
            print(idx)
            idx+=3
    
    3 回复  |  直到 6 年前
        1
  •  3
  •   Green Cloak Guy    6 年前

    不要使用 for 循环。

    对于 Python中的循环与C或Java不同。在这些语言中, 对于 循环有 初始条件 A 终止条件 和一个 增量 每次循环运行。而在python中, 对于 循环更像是 for each 循环-你给它一个可Iterable对象,它为该可Iterable对象中的每一项运行代码。

    修改iterable对象 当你跑过去的时候 这是一个坏主意,很难预测影响,通常会破坏代码。


    但是,您可以始终使用 while 循环:

    a = [0,0,1,0,0,1,0]
    idx = 0
    
    while(idx < len(a) - 2):
        print(idx)
        if a[idx + 2] == 0:
            idx += 2
        elif a[idx + 2] == 1:
            idx += 1
    print(idx)
    

    产生预期产量

    0 1 3 4 6
    

    或者,如果将增量更改为 3 2 分别,而不是 1 ,

    0 2 5
    
        2
  •  0
  •   True Demon    6 年前

    你的推理很混乱,我看不出来 任何 申请这个,但这是我如何理解你的问题…

    原因是因为你没有实际返回值,你只是返回了索引+3,这是错误的开始。您要做的是根据数组的值指向该数组的新索引,如果该索引包含大于0的值,则返回该索引。

    您需要引用所需的索引,检查其值,然后返回包含值的索引。

    a = [0, 0, 1, 0, 0, 1, 0]
    for i, v in enumerate(a):
       if i == 0:
          print(i)
          next
       if v == 0:
          next
       else
          print(i)
    

    但是,老实说,这是非常丑陋和非蟒蛇。让我们简单地检查一下[i]是否包含一个值,如果包含,返回索引…

    for i, v in enumerate(a):
       if v or i == 0:
          print(i)
    

    目的 if v or i == 0 是检查v是否有值,如果有,则打印索引。或者如果我们在看i的第一个元素。

    如果要将索引显式移动两个,则必须在开始处设置索引,并使用while循环,因为Enumerate在这里不能帮助您,并且实际上不允许您移动索引…

    a = [0, 0, 1, 0, 0, 1, 0]
    i = 0
    while i < len(a) - 1:   # -1 to avoid out of bounds error
       print(i)
       if a[i + 2] == 0:
          i += 2
       elif a[i + 2] == 1:
          i += 1
    print(i)            # Final print statement for the last index at the end of the while loop
    

    我想让您印象深刻的是,这个解决方案不能用不同的或更大的列表进行扩展,这就是为什么不推荐它的原因。通过简单地检查一个值是否存在,就可以保证您的准确性。

    您只需根据索引是否包含值返回索引。即使对于非常大的列表,这也将是非常快的,并且始终可以缩放,即使对于大于1的值也是如此。

    唯一的其他原因,我会看到你会想这样做不同的是,如果你正在做字符串搜索算法。

        3
  •  0
  •   Mac    6 年前

    我相信每次迭代,python都会刷新变量。所以在第一次运行结束时,idx将为3,但在第二次运行开始时,它将被重置为1。

    如果你想在3秒内完成一个循环,你仍然可以使用for循环

    for i in range(0,len(a),3):
      print(i)
    

    如果您想要一个动态迭代值,那么您需要使用while循环。

    i=0
    while i<len(a):
      print(i)
      if(a[i]==0):
        i+=2
      else:
        i+=1