Как удалить элементы без изменения списка?
Нужно удалить три max-элемента из списка, причём нельзя изменять список. Как сделать тут копию этого списка(правильно) и удалить с конца списка и вернуться к нужному виду?
elements = [5, 6, 7, 8, 9, 10, 9, 14, 15, 16, 17, 19, 20, 21, 22]
elements_copy = elements.copy()
for _ in range(3):
elements_copy.remove(max(elements_copy))
print(elements, elements_copy, sep="\n")
Как это сделать БЕЗ циклов, с использованием функции? (чтобы список не изменялся, надо работать с копией списка, а потом вернуться к нормальному виду)
Ответы (2 шт):
Как это сделать БЕЗ циклов, с использованием функции?
Можно реализовать рекурсию:
def f(li, n=3):
if n == 0:
return li
li.remove(max(li))
return f(li, n-1)
Если вдруг я правильно сумел понять задачу, то вот так:
elements = [5, 6, 7, 8, 9, 10, 9, 14, 15, 16, 17, 19, 20, 21, 22]
elements_copy = list(filter(lambda x: x not in sorted(elements)[-3:], elements))
print(elements, elements_copy, sep="\n")
Вывод:
[5, 6, 7, 8, 9, 10, 9, 14, 15, 16, 17, 19, 20, 21, 22]
[5, 6, 7, 8, 9, 10, 9, 14, 15, 16, 17, 19]
В копию списка попадают все элементы кроме трёх максимальных, которые мы отобрали, взяв последние 3 элемента отсортированного во возрастанию списка. Для подобной фильтрации итерируемых объектов в Python есть специальная функция filter.
P.S. Реализация в виде отдельной функции по просьбе автора вопроса:
def filter3max(elements):
return list(filter(lambda x: x not in sorted(elements)[-3:], elements))
elements = [5, 6, 7, 8, 9, 10, 9, 14, 15, 16, 17, 19, 20, 21, 22]
print(elements, filter3max(elements), sep="\n")