Вопрос-Ответ

Modifying list while iterating [duplicate]

Изменение списка во время итерации
l  = range(100)                         
for i in l:
print i,
print l.pop(0),
print l.pop(0)

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

Пожалуйста, объясните.

Переведено автоматически
Ответ 1

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

Непонятно только, какого поведения вы пытаетесь достичь, если оно есть ?! Может быть, вы можете выразить свои желания с помощью while ...?

i = 0
while i < len(some_list):
print i,
print some_list.pop(0),
print some_list.pop(0)
Ответ 2

Раньше меня кусал (чужой) "умный" код, который пытается изменить список во время итерации по нему. Я решил, что никогда не буду этого делать ни при каких обстоятельствах.

Вы можете использовать оператор slice mylist[::3] для перехода к каждому третьему элементу в вашем списке.

mylist = [i for i in range(100)]
for i in mylist[::3]:
print(i)

Другие моменты в моем примере связаны с новым синтаксисом в python 3.0.


  • Я использую понимание списка для определения mylist, потому что это работает в Python 3.0 (см. Ниже)

  • print - это функция в python 3.0


Range() Python 3.0 теперь ведет себя так же, как раньше xrange(), за исключением того, что он работает со значениями произвольного размера. Последнего больше не существует.


Ответ 3

Общее эмпирическое правило заключается в том, что вы не изменяете коллекцию / массив / список во время итерации по нему.

Используйте дополнительный список для хранения элементов, с которыми вы хотите действовать, и выполнения этой логики в цикле после вашего начального цикла.

Ответ 4

Используйте цикл while, который проверяет достоверность массива:

while array:
value = array.pop(0)
# do some calculation here

И он должен делать это без каких-либо ошибок или забавного поведения.

2023-08-18 21:33 python list