【发布时间】:2010-05-24 01:34:05
【问题描述】:
我有一个关于 Python 中循环结构的问题,形式为:for x in y: 在我的例子中,y 是从文件中读取的一行,x 是单独的字符。我想在输出中的每对字符之后放置一个空格,例如:aa bb cc dd 等。所以,我想知道当前的迭代。有可能吗,还是我需要使用更传统的 C 风格的带索引的循环?
【问题讨论】:
我有一个关于 Python 中循环结构的问题,形式为:for x in y: 在我的例子中,y 是从文件中读取的一行,x 是单独的字符。我想在输出中的每对字符之后放置一个空格,例如:aa bb cc dd 等。所以,我想知道当前的迭代。有可能吗,还是我需要使用更传统的 C 风格的带索引的循环?
【问题讨论】:
for i,x in enumerate(y):
....
【讨论】:
使用enumerate:
for index,x in enumerate(y):
# do stuff, on iteration #index
或者,只需创建一个变量并在循环体内递增它。不过,这并不像“pythonic”。
cur = 0
for x in y:
cur += 1
# do stuff, on iteration #cur
【讨论】:
cur++ 太不合 Python 以至于会给出语法错误,所以很难推荐它;-)。我认为您的意思是cur+=1(至少可以工作,尽管与枚举相比它很糟糕;-)。
enumerate 更漂亮。)
如果您正在做的是在每对字符之后插入一个空格,那么您可能需要使用以下列表推导式做一些事情:
' '.join([''.join(characterPair) for characterPair in zip(*[iter(line + ' ')] * 2)])
在不附加额外空格的情况下,将丢弃奇数行的最后一个字符;加上空格,奇数个字符的行末尾会有一个额外的空格。
(可能有一种比我所做的更 Pythonic 的方式。)
【讨论】:
我真的不能证明这比 enumerate 方法更好,但对于从 C 角度来看的人来说不太明显,所以我想我会指出它的完整性:
from itertools import izip_longest
' '.join(j + k for j,k in izip_longest(fillvalue='', *([iter(line)]*2)))
在 Python 中,通常更喜欢(或至少鼓励)使用生成器或列表推导来做一些这样的事情,而不是依赖于 enumerate。
这是itertools module documentation 的grouper 方法的变体。
【讨论】: