[英]Looping through triplets for zigzag pattern
我正在嘗試查看具有連續元素的三個一組是否具有鋸齒形圖案。 添加到一個空列表“1”代表之字形,“1”代表曲折,或“0”都不代表。 它似乎滿足了我的第一個“if”條件和我的“else”語句,但從不滿足中間條件。 我已經嘗試將它作為兩個 if 語句,一個 if 和一個 elif,並嵌套。 答案應該是 [1,1,0] 但我只能得到 [1,0] 或沒有 output 有時“索引超出范圍”。 輸入 [1,2,1,3,4] output [1,1,0]
def solution(numbers):
arr = []
for i in range(len(numbers)-2):
if numbers[i+1] > numbers[i] and numbers[i+2]:
arr.append(1)
if numbers[i+1] < numbers[i] and numbers[i+2]:
arr.append(1)
else:
arr.append(0)
return arr
將解決方案分為兩部分:
您可以使用帶有切片的zip
來迭代每對連續元素:
def zig_zags(numbers):
zigzags = [(a - b) // abs(a - b) for a, b in zip(numbers, numbers[1:])]
return [int(a and b and a != b) for a, b in zip(zigzags, zigzags[1:])]
print(zig_zags([1, 2, 1, 3, 4])) # [1, 1, 0]
你在這里有一個滑動的 window 。
你得到IndexError
因為你的代碼有for i in range(len(numbers))
,然后你要求numbers[i+2]
。 為防止這種情況,請減小范圍:
for i in range(len(numbers) - 2):
<do checks on numbers[i], numbers[i+1], numbers[i+2]>
但是您可能更喜歡將zip
一些切片放在一起:
for a, b, c in zip(numbers[:-2], numbers[1:-1], numbers[2:]):
<do checks on a, b, c>
您可以使用 zip 將元素 3 x 3 組合並比較每個三重奏以檢查中間元素是大於其相鄰元素還是小於它們兩者:
numbers = [1,2,1,3,4]
result = [int((a-b)*(b-c)<0) for a,b,c in zip(numbers,numbers[1:],numbers[2:])]
print(result) # [1, 1, 0]
zip 將組合偏移 0、1 和 2 的項目,產生以下三重奏:
numbers [1,2,1,3,4]
numbers[1:] [2,1,3,4]
numbers[2:] [1,3,4]
zip(): * * * <-- 3 trios (extras are ignored)
a,b,c a-b b-c (a-b)*(b-c) int(...<0)
-------
(1,2,1) -1 1 -1 1
(2,1,3) 1 -2 -2 1
(1,3,4) -2 -1 2 0
感謝大家!
建議我定義結束范圍以避免索引超出范圍錯誤(更改為 len(numbers)-2),並且我將格式從“numbers[i+1] < numbers[i] 和 numbers[i+2] 更改]”到“數字[i] > 數字[i+1] < 數字[i+2]”。 還建議我嘗試 zip function,我將在下次學習。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.