Изменение списка при итерации [копирует]

Ему нужен намного больший словарь для отображения в обратном направлении, и он имеет меньшую вероятность столкновения.

53
задан Xolve 28 October 2009 в 04:56
поделиться

5 ответов

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

Вы можете использовать оператор среза 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

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

42
ответ дан 7 November 2019 в 08:30
поделиться

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

for i in xrange(0, 100, 3):
    print i

См. xrange .

8
ответ дан 7 November 2019 в 08:30
поделиться

Этот синтаксис фрагмента создает копию списка и делает то, что вы хотите:

l  = range(100)  
for i in l[:]:  
    print i,  
    print l.pop(0),  
    print l.pop(0)
0
ответ дан 7 November 2019 в 08:30
поделиться

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

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

11
ответ дан 7 November 2019 в 08:30
поделиться

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

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

i = 0
while i < len(some_list):
    print i,                         
    print some_list.pop(0),                  
    print some_list.pop(0)
52
ответ дан 7 November 2019 в 08:30
поделиться
Другие вопросы по тегам:

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