我试图找出如何以可变步骤遍历数组或列表。
例如,如果我有以下列表...
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
答案 0 :(得分:3)
不要使用for
循环。
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
或者,如果您将增量分别更改为3
和2
,而不是2
和1
,
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