Ему нужен намного больший словарь для отображения в обратном направлении, и он имеет меньшую вероятность столкновения.
Раньше меня кусал (чужой) "умный" код, который пытается изменить список, перебирая его. Я решил, что никогда не сделаю этого ни при каких обстоятельствах.
Вы можете использовать оператор среза mylist [:: 3]
, чтобы переходить к каждому третьему элементу в вашем списке.
mylist = [i for i in range(100)]
for i in mylist[::3]:
print(i),
Другие моменты, касающиеся мой пример относится к новому синтаксису в python 3.0 .
Python 3.0 range () теперь ведет себя как xrange (), за исключением он работает со значениями произвольного размера. Последний больше не существует.
Попробуйте это. Это позволяет избежать изменения того, что вы повторяете, что обычно является запахом кода.
for i in xrange(0, 100, 3):
print i
См. xrange
.
Этот синтаксис фрагмента создает копию списка и делает то, что вы хотите:
l = range(100)
for i in l[:]:
print i,
print l.pop(0),
print l.pop(0)
Общее практическое правило состоит в том, что вы не изменяете коллекцию / массив / список во время итерации по нему.
Используйте вторичный список для хранения элементов, над которыми вы хотите действовать, и выполните эту логику в цикле после исходного цикла.
Никогда не изменяйте контейнер, в котором вы зацикливаетесь, потому что итераторы в этом контейнере не будут проинформированы о ваших изменениях, и, как вы заметили, вполне вероятно, что это приведет к совершенно другому циклу и / или неправильному. В обычных случаях цикл на копии контейнера помогает, но в вашем случае ясно, что вы не этого хотите, поскольку контейнер будет пуст после 50 этапов цикла, и если вы затем попытаетесь при повторном появлении вы получите исключение.
Что НО ясно, какого поведения вы пытаетесь добиться, если таковое имеется ?! Может быть, вы сможете выразить свои желания с помощью , а
...?
i = 0
while i < len(some_list):
print i,
print some_list.pop(0),
print some_list.pop(0)