Вот что я смог написать для w = 2.
A = [1,2,3,2,1,4,3,2,5,1,2,6,1,2,7]
w = 2
for i in range(w, len(A)- w):
for j in range(w):
if A[i] > A[j] and A[i] > A[i-1]:
if A[i] > A[j+4] and A[i] > A[i+1]:
print(A[i])
Output: 3
4
5
5
6
6
Первый вывод равен 3 (1,2,3,2,1), что является максимальным из его левых «w» элементов 1,2 и правых «w» элементов 2,1. Точно так же второй выход 4 получен из (2,1,4,3,2) и так далее.
Как мне расширить это для w = n, где n = 3, 4, 5?
import numpy as np
Если у вас есть:
A = np.array([1,2,3,2,1,4,3,2,5,1,2,6,1,2,7])
Ты можешь сделать:
result=[]
w=2
for i in range(w, len(A)-w):
if all(A[i] > A[i-w:i]) and all(A[i] > A[i+1:i+w+1]):
result.append(A[i])
result
будет:
[3, 4, 5, 6]
Если вы измените определение A
на A = np.array([7,2,-3,9,1,4,3,2,10,11,2,6,1,2,7])
, а w
на 3
, то result
будет:
[9, 11]
как и ожидалось, я надеюсь.
Хотя мне нравится ответ zabop, есть более простой способ добиться того же результата, также без использования numpy
:
A = [1,2,3,2,1,4,3,2,5,1,2,6,1,2,7]
w = 2
for i in range(w, len(A)- w):
greater = True
for j in range(1,w+1):
if A[i-j] >= A[i] or A[i+j] >= A[i]:
greater = False
break
if greater:
print(A[i])
Выход
3
4
5
6
Использование только for loop
в Python:
for i in range(w, len(A)-w):
s = []
for j in range(1, w+1):
s.append(A[i] >= A[i-j] and A[i] >= A[i+j])
if sum(s)==w:
print(A[i])
Смешивание for loop
с list comprehension
:
for i in range(w, len(A)-w):
if sum([A[i] >= A[i-j] and A[i] >= A[i+j] for j in range(1,w+1)]) == w:
print(A[i])
Выход (для обоих):
3
4
5
6
Сумасшедший однострочный list comprehension
:
[A[i] for i in range(w, len(A)-w) if sum([A[i] >= A[i-j] and A[i] >= A[i+j] for j in range(1,w+1)]) == w]
Выход:
[3, 4, 5, 6]