Поиск показателя бегуна в коде списка не работает [дубликат]

В современных браузерах вы можете использовать структуру данных Map вместо объекта.

Разработчик mozilla> Карта

Объект Map может выполнять итерацию своих элементов в порядке ввода ...

4
задан bodacydo 14 March 2010 в 16:36
поделиться

2 ответа

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

L[:] = [el for el in L if el != 3]

понимание списка создает желаемый список и назначение в «список всего списка», L[:], убедитесь, что вы не просто переименовываете имя, но полностью заменяете contents , поэтому эффекты одинаково равны «удалениям», которые вы хотели выполнить. Это также очень быстро.

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

>>> ndel = 0
>>> for i, el in enumerate(list(L)):
...    if el==3:
...      del L[i-ndel]
...      ndel += 1

нигде элегантный, чистый, простой или хорошо исполняемый, как подход listcomp, но он выполняет свою работу (хотя его правильность на первый взгляд не очевидна, и на самом деле я ошибался перед редактированием!). «любой ценой» применим здесь: -).

Зацикливание по индексам вместо элементов - это другой нижний, но работоспособный подход для случая «должен делать делеции», но помните об обратном индексы в этом случае ...:

for i in reversed(range(len(L))):
  if L[i] == 3: del L[i]

действительно, это был основной случай использования для reversed назад, когда мы обсуждали вопрос о том, добавить ли это встроенный reversed(range(... не является тривиальным для получения без reversed, и иногда полезно использовать цикл в списке в обратном порядке. Альтернатива

for i in range(len(L) - 1, -1, -1):

действительно легко ошибиться; -).

Тем не менее, список, который я рекомендовал в начале этого ответа, выглядит лучше и лучше, когда рассматриваются альтернативы, не так ли? -).

13
ответ дан Alex Martelli 17 August 2018 в 11:32
поделиться
  • 1
    Хорошая идея. Я не думал об этом. Спасибо, Алекс! :) – bodacydo 14 March 2010 в 16:39
  • 2
    @bodacydo, пожалуйста! – Alex Martelli 14 March 2010 в 16:40
  • 3
    Второй подход удалит неправильные элементы, если удалить более одного элемента, поскольку индексы изменяются после первого удаления. – interjay 14 March 2010 в 16:47
  • 4
    @interjay, +1: вы правы, я отредактировал, чтобы компенсировать это (к сожалению, reversed(enumerate(... не работает - enumerate является итерируемой, но не последовательностью, reversed нуждается в последовательности в качестве аргумента). – Alex Martelli 14 March 2010 в 16:58
for el in L:
    if el == 2:
        del L[el]
-4
ответ дан myfreeweb 17 August 2018 в 11:32
поделиться
  • 1
    необходимо перечислить так, чтобы вы могли индексировать L [idx]. – Andrew Jaffe 14 March 2010 в 16:43
  • 2
    Нет, это будет действительно действительно странным образом - удаление L's "третьего элемента" (возможно, более одного раза), если полностью не связанные элементы равны 2 и часто пропускают элемент в L, когда он делает такие удаления. Какой кошмар отлаживать ...! -) – Alex Martelli 14 March 2010 в 16:44
Другие вопросы по тегам:

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