簡體   English   中英

以可變步驟遍歷數組或列表

[英]loop through array or list in variable steps

我試圖弄清楚如何以可變步驟遍歷數組或列表。

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

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

不要使用for循環。

python中的for循環與C或Java中的for循環不同。 在這些語言中, 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

您的推理非常混亂,我對此看不到任何申請,但這是我如何理解您的問題...

原因是因為您實際上並沒有返回值,而只是返回了索引+ 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循環,因為枚舉在這里無濟於事,並且實際上並不能讓您移動索引...

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。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM