Python 以可变步长循环遍历数组或列表

Python 以可变步长循环遍历数组或列表,python,list,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 不要对循环使用

我试图弄清楚如何以可变的步骤循环遍历数组或列表

例如,如果我有以下列表

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

不要对循环使用

python中的
for
循环与C或Java中的循环不同。在这些语言中,for
循环的
具有初始条件、终止条件和每次循环运行时的增量。而在python中,
for
循环更像是每个
循环的
——您给它一个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)
或者,如果将增量分别更改为
3
2
,而不是
2
1

0 2 5

不要对
循环使用

python中的
for
循环与C或Java中的循环不同。在这些语言中,for
循环的
具有初始条件、终止条件和每次循环运行时的增量。而在python中,
for
循环更像是每个
循环的
——您给它一个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)
或者,如果将增量分别更改为
3
2
,而不是
2
1

0 2 5

你的推理相当混乱,我看不出有任何应用,但以下是我如何理解你的问题

原因是,您实际上并没有返回值,只是返回了索引+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)
如果v或i==0,则
的目的是检查v是否有值,如果有,则打印索引。或者如果我们看的是i的第一个元素

如果要显式地将索引移动2,必须在开始时设置索引并使用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
a=[0,0,1,0,0,1,0]
i=0
而i
我想让您记住一个事实,即此解决方案不能扩展到不同或更大的列表,这就是为什么不推荐它。通过简单地检查某个值是否存在,可以保证准确性

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


我认为您希望以不同方式执行此操作的唯一其他原因是,如果您正在执行字符串搜索算法。

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

原因是,您实际上并没有返回值,只是返回了索引+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)
如果v或i==0,则
的目的是检查v是否有值,如果有,则打印索引。或者如果我们看的是i的第一个元素

如果要显式地将索引移动2,必须在开始时设置索引并使用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
a=[0,0,1,0,0,1,0]
i=0
而i
我想让您记住一个事实,即此解决方案不能扩展到不同或更大的列表,这就是为什么不推荐它。通过简单地检查某个值是否存在,可以保证准确性

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


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