Не получается выразить "следующий" элемент
Условие задачи. На вход подается одномерный массив (список). Требуется разработать функцию, которая позже будет использована для свертки элементов последовательности. Функция должна проверить, является ли текущий элемент больше следующего. Вернуть текущий элемент если это так, иначе, вернуть следующий элемент. Запрещается использовать циклы. Массив (список) должен быть придуман и использован студентом для тестирования кода самостоятельно.
Теперь сама проблема: не получается выразить этот самый "следующий" элемент. Пытался использовать функцию def, пробовал всунуть в map лямбду, потом пробовал то же самое с filtеr. Из-за того, что не получается выразить элемент, стоящий после текущего, я не могу задать условие. Мои попытки:
1)
sequences = [10,2,8,7,5,4,3,11,0, 1]
filtered_result = filter (lambda x: x if x > sequences.index(x + 1))
print(list(filtered_result))
Тут я пытаюсь отфильтровать элементы списка sequences, ничего не выходит.
2)
def counter(x):
if x[i - 1] < x[i]:
return x[i]
else:
return x[i + 1]
lst = [11,1,34,21,20,71,59]
a = list(map(counter, lst))
print(a)
Здесь я пытаюсь создать функцию counter которая будет вычислять те элементы, которые больше последующих. А потом я с помощью map применяю эту функцию к списку lst. Но здесь снова возникает проблема выражения этого последующего элемента.
3)
function_l = lambda x: x if x > x + 1 else x + 1
a = map(function_l, lst)
print(list(a))
Здесь пытаюсь сделать то же самое, что в первом пункте, только с map вместо фильтра.
Ответы (2 шт):
Если я правильно понял вам нужна функция reduce - она сворачивает последовательности. Судя по условию, вам нужно получить самое большое число из списка - это можно сделать так:
from functools import reduce
sequences = [10, 2, 8, 7, 5, 4, 3, 11, 0, 1]
lst = [11, 1, 34, 21, 20, 71, 59]
def check(a, b):
return a if a > b else b
print(reduce(check, sequences))
print(reduce(check, lst))
Вывод:
11
71
UPDATE
Вот такое вам нужно, судя по комментарию?
print(list(map(check, sequences, sequences[1:])))
Вывод:
[10, 8, 8, 7, 5, 4, 11, 11, 1]
UPDATE 2
Или без повторений:
print(list(dict.fromkeys(map(check, sequences, sequences[1:]))))
Вывод:
[10, 8, 7, 5, 4, 11, 1]
Последовательности текущих и следующих элементов можно застегнуть с помощью zip:
sequences = [10,2,8,7,5,4,3,11,0,1]
result = [a if b is None or a > b else b
for a, b in zip(sequences, sequences[1:]+[None])]
print(result)
[10, 8, 8, 7, 5, 4, 11, 11, 1, 1]
То же, с map:
result = list(map(lambda a, b: a if b is None or a > b else b,
sequences, sequences[1:]+[None]))