2013-08-04 1 views
4

Только что заметили, что в Python нет функции для удаления элемента в списке по индексу, который будет использоваться в то время как chaining.Функция на месте для удаления элемента с использованием индекса в Python

Например, я ищу что-то вроде этого:

another_list = list_of_items.remove[item-index]

вместо

del list_of_items[item_index]

Поскольку remove(item_in_list) возвращает список после удаления item_in_list; Интересно, почему аналогичная функция для индекса отсутствует. Кажется очень очевидным и тривиальным, чтобы быть включенным, считает, что есть причина пропустить это.

Любые мысли о том, почему такая функция недоступна?

----- РЕДАКТИРОВАТЬ -------

list_of_items.pop(item_at_index) не подходит, поскольку он не возвращает список без конкретного элемента, чтобы удалить, следовательно, не может быть использована для цепи. (В соответствии с Документами: L.pop ([индекс]) -> пункт - удалить и вернуть элемент с индексом)

+2

Операции на месте Python, как правило, возвращают 'None', никогда не измененный объект. Почему вы ожидаете, что сможете подключаться, если стандартные типы Python, не изменяющиеся, не предлагают этого в другом месте? –

+0

Я ожидал, что это будет 'remove()' существует. Он возвращает измененный объект. –

+1

Нет, 'list.remove()' возвращает 'None', а не измененную последовательность. См. Http://ideone.com/mEH1LL –

ответ

1

Использование list.pop:

>>> a = [1,2,3,4] 
>>> a.pop(2) 
3 
>>> a 
[1, 2, 4] 

Согласно документации:

s.pop ([i])

такой же, как x = s [i]; del s [i]; вернуться х

UPDATE

Для цепочки, вы можете использовать следующий трюк. (Используя временную последовательность, которая содержит исходный список):

>>> a = [1,2,3,4] 
>>> [a.pop(2), a][1] # Remove the 3rd element of a and 'return' a 
[1, 2, 4] 
>>> a # Notice that a is changed 
[1, 2, 4] 
+0

Правда, просто отредактировал вопрос об этом. –

+0

-1 Как @BartoszKP говорит, 'pop' не может использоваться для цепочки. (Это то, чего хочет OP, несмотря на запутанный титул на вопрос.) – LondonRob

+0

@LondonRob, Спасибо, что сообщили мне причину. Я обновил ответ, который позволяет цепочки. – falsetru

0

Как Martijn Pieters отмечалось в комментариях к этому вопросу, это не не реализуется как: операций Python в месте, как правило, не возвращают None, никогда измененное объект.

0

Вот хороший Pythonic способ сделать это с помощью list comprehensions и enumerate (обратите внимание, что enumerate является нулевой индексированный):

>>> y = [3,4,5,6] 
>>> [x for i, x in enumerate(y) if i != 1] # remove the second element 
[3, 5, 6] 

Преимущество этого подхода заключается в том, что вы можете сделать несколько вещей сразу:

>>> # remove the first and second elements 
>>> [x for i, x in enumerate(y) if i != 0 and i != 1] 
[5, 6] 
>>> # remove the first element and all instances of 6 
>>> [x for i, x in enumerate(y) if i != 0 and x != 6] 
[4, 5] 
+0

OP упоминает« на месте »в названии. Пояснение списка возвращает новый список. – falsetru

+0

@falsetru Правильно: * название * упоминается на месте. * Вопрос * спрашивает о цепочке, что это позволит. На самом деле вопросы задают * противоположную * на месте. 'x.remove()' находится на месте, но не позволяет цепочки. – LondonRob

+0

* на месте * методы могут быть прикованы. Проверьте мой обновленный ответ. ;) – falsetru