Я не думаю, что шаблоны по сути являются проблемой, а скорее тем, что разработчики могут изучить шаблоны и затем сверхприменить их или применить их способами, которые являются дико несоответствующими.
использование шаблонов - что-то, что опытные программисты просто изучают естественно. Вы решали некоторую проблему X много раз, Вы знаете, какой подход работает, Вы используете тот подход, потому что Ваш навык и опыт говорят Вам, что это является соответствующим. Это - шаблон, и это хорошо.
, Но это одинаково возможно для программиста, который менее квалифицирован для нахождения одного способа сделать вещи и попытку переполнить каждую проблему, с которой они сталкиваются в ту форму, потому что они не знают никакой другой путь. Это - шаблон также, и это является злым.
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]
По большей части я отвечаю на любой вопрос о " как удалить из списка то, что я не делаю
for i in I:
del L[i]
не будет работать, потому что (в зависимости от порядка) вы можете аннулировать итератор - это обычно отображается как некоторые элементы, которые вы намеревались удалить, оставшиеся в списке.
Всегда безопасно удалять элементы из списка в порядке, обратном их индексам. Самый простой способ сделать это - использовать sorted ():
for i in sorted(I, reverse=True):
del L[i]
Если данные вашего исходного списка можно безопасно превратить в набор (т.е. все уникальные значения и не 'не нужно поддерживать порядок), вы также можете использовать операции над наборами:
Lset = set(L)
newset = Lset.difference(I)
Возможно, вы также можете что-то сделать с помощью Bag / Multiset, хотя это, вероятно, не стоит усилий. Второе решение listcomp Пола Макгуайра, безусловно, лучше всего для большинства случаев.