Создать копию списка и удалить элемент

1

Я хотел бы написать что-то вроде этого

S = [ 0, 1, 2 ]
F = [ S.without(i) for i in range(0,len(S)) ]
print F

и Python, вставляя

[[0,1], [0,2], [1,2]]

и не нашли что-то подобное в онлайн-ссылке. Можете ли вы мне помочь?

  • 2
    Разве выходные данные не должны быть [[1, 2], [0, 2], [0, 1]] ?
  • 1
    у вас есть лучшее определение для without ? Существует некоторая путаница по поводу того, что он должен делать.
Показать ещё 2 комментария
Теги:
list

3 ответа

2
Лучший ответ
>>> S = [0, 1, 2]
>>> F = [S[0:i] + S[i+1:] for i in range(len(S))]
>>> print F
[[1, 2], [0, 2], [0, 1]]
>>> 

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

>>> S = set(range(3))
>>> F = [S - set((i,)) for i in S]
>>> F
[set([1, 2]), set([0, 2]), set([0, 1])]
  • 0
    Интересное решение.
  • 0
    Это немного отличается ... он выводит кусочки списка вокруг определенного индекса. Решение @ bradley.ayers выводит часть списка, которая не содержит определенного значения. Рассмотрим S = [1, 1, 2, 2] . Я не уверен, какой ОП просит.
Показать ещё 3 комментария
6

Python предоставляет itertools.combinations, который делает именно то, что вы хотите:

>>> import itertools
>>> s = [0,1,2]
>>> list(itertools.combinations(s, len(s) - 1))
[(0, 1), (0, 2), (1, 2)]

Еще лучше, он возвращает генератор, поэтому вы можете легко перебирать все комбинации, не используя много памяти.

  • 0
    Это, безусловно, путь. Если, конечно, @Martin действительно не нужен list list s.
  • 0
    Кинг, хороший ответ на примере ОП, но, может быть, ОП не хочет все комбинации? Возможно, он действительно хочет иметь возможность вырезать, удаляя один элемент. Но сложно сказать, не так ли?
Показать ещё 1 комментарий
1

Вложенное понимание списка может выполнять следующее задание:

>>> S = [ 0, 1, 2 ]
>>> F = [[x for x in S if x != s] for s in S]
>>> print F
[[1, 2], [0, 2], [0, 1]]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню