Удалите много элементов списка (Python)

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

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

, Но это одинаково возможно для программиста, который менее квалифицирован для нахождения одного способа сделать вещи и попытку переполнить каждую проблему, с которой они сталкиваются в ту форму, потому что они не знают никакой другой путь. Это - шаблон также, и это является злым.

16
задан Ezequiel 20 September 2009 в 02:18
поделиться

3 ответа

Eine Minuten bitte, Ich hap eine kleine Problemo avec diese Religione. - Эдди Иззард (производит впечатление Мартина Лютера)

Удаление путем обратной итерации по списку для сохранения итератора является общим решением этой проблемы. Но другое решение - превратить это в другую проблему. Вместо того, чтобы удалять элементы из списка по некоторым критериям (в вашем случае индекс существует в списке индексов, подлежащих удалению), создайте новый список, в котором будут исключены элементы, вызывающие нарушение.

L[:] = [ item for i,item in enumerate(L) if i not in I ]

В этом отношении, откуда вы пришли вверх с индексами в I в первую очередь? Вы можете объединить логику удаления индексов и построения нового списка. Предполагая, что это список объектов, и вы хотите оставить только те, которые прошли тест isValid :

L[:] = [ item for item in L if item.isValid() ]

Это намного проще, чем:

I = set()
for i in range(len(L)):
    if not L[i].isValid():
        I.add(i)

for i in sorted(I, reverse=True):
    del L[i]

По большей части я отвечаю на любой вопрос о " как удалить из списка то, что я не делаю

32
ответ дан 30 November 2019 в 15:56
поделиться
for i in I:
    del L[i]

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

Всегда безопасно удалять элементы из списка в порядке, обратном их индексам. Самый простой способ сделать это - использовать sorted ():

for i in sorted(I, reverse=True):
    del L[i]
9
ответ дан 30 November 2019 в 15:56
поделиться

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

Lset = set(L)
newset = Lset.difference(I)

Возможно, вы также можете что-то сделать с помощью Bag / Multiset, хотя это, вероятно, не стоит усилий. Второе решение listcomp Пола Макгуайра, безусловно, лучше всего для большинства случаев.

1
ответ дан 30 November 2019 в 15:56
поделиться
Другие вопросы по тегам:

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