Как удалить элементы без изменения списка?

Нужно удалить три 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 шт):

Автор решения: nomnoms12

Как это сделать БЕЗ циклов, с использованием функции?

Можно реализовать рекурсию:

def f(li, n=3):
    if n == 0:
        return li

    li.remove(max(li))
    return f(li, n-1)
→ Ссылка
Автор решения: CrazyElf

Если вдруг я правильно сумел понять задачу, то вот так:

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")
→ Ссылка