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 inrange(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
И он должен делать это без каких-либо ошибок или забавного поведения.