Удаление нескольких элементов из списка

Действительно ли возможно удалить несколько элементов из списка одновременно? Если я хочу удалить элементы в индексе 0 и 2 и попробовать что-то как del somelist[0], сопровождаемый del somelist[2], второй оператор на самом деле удалит somelist[3].

Я предполагаю, что мог всегда удалять более высокие пронумерованные элементы сначала, но я надеюсь, что существует лучший путь.

142
задан Løiten 14 October 2019 в 12:31
поделиться

9 ответов

Вероятно, не лучшее решение для этой проблемы:

indices = 0, 2
somelist = [i for j, i in enumerate(somelist) if j not in indices]
95
ответ дан 23 November 2019 в 23:01
поделиться

Можно сделать тот путь на dict, не в списке. В списке элементы находятся в последовательности. В dict они зависят только от индекса.

Простой код только для объяснения этого путем выполнения :

>>> lst = ['a','b','c']
>>> dct = {0: 'a', 1: 'b', 2:'c'}
>>> lst[0]
'a'
>>> dct[0]
'a'
>>> del lst[0]
>>> del dct[0]
>>> lst[0]
'b'
>>> dct[0]
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    dct[0]
KeyError: 0
>>> dct[1]
'b'
>>> lst[1]
'c'

А способ "преобразовать" список в dict:

>>> dct = {}
>>> for i in xrange(0,len(lst)): dct[i] = lst[i]

инверсия:

lst = [dct[i] for i in sorted(dct.keys())] 

Так или иначе я думаю, что лучше начать удалять из более высокого индекса, как Вы сказали.

1
ответ дан 23 November 2019 в 23:01
поделиться

Я могу на самом деле думать о двух способах сделать это:

  1. нарезают список как (это удаляет 1-е, 3-и и 8-е элементы)

    somelist = somelist [1:2] +somelist [3:7] +somelist [8:]

  2. делают это на месте, но по одному:

    somelist.pop (2) somelist.pop (0)

1
ответ дан 23 November 2019 в 23:01
поделиться

Как функция:

def multi_delete(list_, *args):
    indexes = sorted(list(args), reverse=True)
    for index in indexes:
        del list_[index]
    return list_

Выполнения в журнал n (n) время, которое должно сделать это самым быстрым правильным решением все же.

17
ответ дан 23 November 2019 в 23:01
поделиться

Если Вы удаляете несколько несмежных объектов, то то, что Вы описываете, является лучшим способом (и да, несомненно, начнут с самого высокого индекса).

, Если Ваши объекты смежны, можно использовать синтаксис присвоения части:

a[2:10] = []
102
ответ дан 23 November 2019 в 23:01
поделиться

Так, Вы по существу хотите удалить несколько элементов в одной передаче? В этом случае положение следующего элемента, который удалит, будет смещено однако, многие были удалены ранее.

Наша цель состоит в том, чтобы удалить все гласные, которые предварительно вычисляются, чтобы быть индексами 1, 4, и 7. Обратите внимание, что его важное, to_delete индексы в порядке возрастания, иначе это не будет работать.

to_delete = [1, 4, 7]
target = list("hello world")
for offset, index in enumerate(to_delete):
  index -= offset
  del target[index]

Это было бы более сложное, если бы Вы хотели удалить элементы в порядке. IMO, сортируя to_delete мог бы быть легче, чем выяснение, когда Вы должны или не должны вычитать от index.

11
ответ дан 23 November 2019 в 23:01
поделиться

Как специализация ответа Greg, можно даже использовать расширенный синтаксис части. например, Если Вы хотели удалить объекты 0 и 2:

>>> a= [0, 1, 2, 3, 4]
>>> del a[0:3:2]
>>> a
[1, 3, 4]

Это не покрывает произвольного выбора, конечно, но он может, конечно, работать на удаление любых двух объектов.

18
ответ дан 23 November 2019 в 23:01
поделиться

Ни один из ответов, предлагаемых до сих пор, не выполняет удаление на месте в O (n) на длине списка для произвольного числа индексов для удаления, таким образом, вот моя версия:

def multi_delete(the_list, indices):
    assert type(indices) in {set, frozenset}, "indices must be a set or frozenset"
    offset = 0
    for i in range(len(the_list)):
        if i in indices:
            offset += 1
        elif offset:
            the_list[i - offset] = the_list[i]
    if offset:
        del the_list[-offset:]

# Example:
a = [0, 1, 2, 3, 4, 5, 6, 7]
multi_delete(a, {1, 2, 4, 6, 7})
print(a)  # prints [0, 3, 5]
0
ответ дан 23 November 2019 в 23:01
поделиться

Можно использовать, удаляют, также.

delete_from_somelist = []
for i in [int(0), int(2)]:
     delete_from_somelist.append(somelist[i])
for j in delete_from_somelist:
     newlist = somelist.remove(j)
0
ответ дан 23 November 2019 в 23:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: