對于給定的串列,如果對于元素a,沒有大于a的相鄰元素,則稱為峰值元素。完成以下函式,該函式回傳給定串列 L 的峰值元素串列:
對于 L = [3,2,4,5,4,3,2,2],函式呼叫 tepeNoktalari(L) 應回傳串列 [3,5,2]。
uj5u.com熱心網友回復:
def findPeak(L):
results = []
for i in range(1, len(L) - 1):
if L[i] > L[i-1] and L[i] > L[i 1]: # check both sides for each
results.append(L[i]) # ^ element of list excluding edge cases
if L[0] > L[1]: results.append(L[0]) # check edge cases
if L[-1] > L[-2]: results.append(L[-1])
return results
array = [3,2,4,5,4,3,2,2]
print("Peak points are: ", findPeak(array))
uj5u.com熱心網友回復:
按照這種方法找到峰值元素
- 檢查第一個元素是否大于或最后一個索引值大于第二個最后一個元素
- 從 L[0] 遍歷陣列到 L[n-2]
- 檢查兩個相鄰元素是否大于 L[i],然后列印元素并終止回圈
uj5u.com熱心網友回復:
我建議在回圈/遍歷方法上使用 numpy 解決方案,因為它會更有效。考慮以下:
L - np.roll(L, shift=1) # difference with left values
L - np.roll(L, shift=1) > 0 # indices of numbers bigger than left neighbor
L - np.roll(L, shift=1) # difference with right values
L - np.roll(L, shift=1) > 0 # indices of numbers bigger than right neighbor
那么顯然我們必須從 L 中取大于它們左右值的數字:這意味著上述索引之間的邏輯與:
L[(L - np.roll(L, shift=1) > 0) & (L - np.roll(L, shift=-1) > 0)]
這仍然使最后一個元素未正確檢查:這是一個簡單的修復:
result = L[(L - np.roll(L, shift=1) > 0) & (L - np.roll(L, shift=-1) > 0)]
if L[-1] >= L[-2]:
result = np.append(result, [L[-1]])
uj5u.com熱心網友回復:
使用 zip 將 L 中的每個專案與前一個和下一個專案組成元組(根據需要使用第一個和最后一個填充)
[x for prevX,x,nextX in zip(L[:1] L,L,L[1:] L[-1:]) if prevX <= x >= nextX]
# [3, 5, 2]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/413397.html
標籤:
