Итеративное удаление значений из списка

Как удалять значения из списка [1, 2, 3], чтобы на выходе получилось [2, 3], [1, 3], [1, 2]. Если делать это в цикле вот так

my_list = [1, 2, 3]
new_list = []
for i in  my_list:
    new_list.append(my_list.remove(i))

то по очереди убираются все значения из списка, а это не то что нам нужно.


Ответы (2 шт):

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

Лучше использовать всё же позиции элементов для их исключения, а не удалять сами элементы:

new_list = [[x for j,x in enumerate(my_list) if i != j] for i in range(len(my_list))]
print(new_list)

Вам в любом случае придётся как-то копировать список, а не "резать по живому". Если добавить копирование к вашему коду, то будет выглядеть примерно так:

my_list = [1, 2, 3]
new_list = []
for i in my_list:
    tmp_list = my_list.copy()
    tmp_list.remove(i)
    new_list.append(tmp_list)
print(new_list)

Тут ещё надо помнить, что remove удаляет элемент и ничего не возвращет.

UPD: При большой длине входного списка оптимальнее использовать второй вариант из-за его линейной сложности: введите сюда описание изображения

→ Ссылка
Автор решения: MaxU

Если вы хотите получить сочетание из my_list по 2, то можно воспользоваться itertools.combinations:

from itertools import combinations

res = list(combinations(my_list, 2))

результат:

In [489]: print(res)
[(1, 2), (1, 3), (2, 3)]

если нужен строго список списков:

res = list(map(list, combinations(my_list, 2)))

результат:

In [491]: res
Out[491]: [[1, 2], [1, 3], [2, 3]]

Сочетание с повторениями:

from itertools import combinations_with_replacement

In [493]: list(combinations_with_replacement(my_list, 2))
Out[493]: [(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)]
→ Ссылка