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

时间:2019-02-05 20:56:03

标签: python list

我试图找出如何以可变步骤遍历数组或列表。

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

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 个答案:

答案 0 :(得分:3)

不要使用for循环。

python中的

for循环与C或Java中的循环不同。在这些语言中,for循环在每次循环运行时都有一个初始条件,一个终止条件和一个增量 。而在python中,for循环更像是for each循环-您为它提供了一个可迭代的对象,它为该可迭代对象中的每个项目运行代码。

在遍历可迭代对象时修改它是一个糟糕的主意,它可能难以预测结果,并且通常会破坏您的代码。


但是,您始终可以使用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

或者,如果您将增量分别更改为32,而不是21

0 2 5

答案 1 :(得分:0)

您的推理非常混乱,我看不到任何应用程序,但这是我如何理解您的问题...

原因是因为您实际上并没有返回值,而只是返回了索引+ 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)

但是,老实说,这是非常丑陋且非Python的。让我们简单地检查a [i]是否包含值,如果是,则返回索引...

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

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

如果您想明确地将索引移动两个,则必须在开始时设置索引并使用while循环,因为枚举在这里无济于事,实际上也无法让您移动索引... < / p>

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的情况下也始终会缩放。

我看到您希望以不同的方式执行此操作的另一个原因是,如果您正在执行字符串搜索算法。

答案 2 :(得分:0)

我相信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