У меня есть вопрос о конструкции цикла в Python в форме: for x in y:
В моем случае y является строкой, считанной из файла, и x является отдельными символами. Я хотел бы поместить пространство после каждой пары символов в выводе, как это: aa bb cc dd
и т.д. Так, я хотел бы знать текущее повторение. Действительно ли это возможно, или я должен использовать более традиционный стиль C для цикла с индексом?
Если то, что вы делаете, вставляете пробел после каждой пары символов, вы можете сделать что-то с пониманием списка, например:
' '.join([''.join(characterPair) for characterPair in zip(*[iter(line + ' ')] * 2)])
Без добавления лишнего пробела, последний символ строк при нечетном количестве символов будет сброшено; с добавленным пробелом строки с нечетным числом символов будут иметь дополнительный пробел в конце.
(Возможно, есть более питонический способ сделать это, чем то, что сделал я.)
Используйте enumerate
:
for index,x in enumerate(y):
# do stuff, on iteration #index
В качестве альтернативы просто создайте переменную и увеличьте ее на единицу внутри тела цикла. Однако это не совсем так «питонический».
cur = 0
for x in y:
cur += 1
# do stuff, on iteration #cur
Я не могу утверждать, что этот метод лучше метода enumerate
, но он менее очевиден для человека, изучающего язык Си, поэтому я решил указать его для полноты:
from itertools import izip_longest
' '.join(j + k for j,k in izip_longest(fillvalue='', *([iter(line)]*2)))
В Python часто предпочитают (или по крайней мере поощряют) делать что-то с помощью генераторов или понимания списков, как этот, вместо того, чтобы полагаться на enumerate
.
Это вариация метода grouper
из документации к модулю itertools.