说我有字符串:
string = 'ABCDEFGHI'
我希望遍历字符串,以便输出:
ABC
DEF
GHI
这可行吗?我可以按照以下方式做点什么:
for i in string, 3:
print i
我觉得我有一个更容易解决的问题。
答案 0 :(得分:1)
实现此目的的简单for
循环将是:
for i in range(3, len(string) + 1, 3):
print string[i-3:i]
使用range()
的{{3}}值按3's
进行迭代,然后使用step=3
对象,该对象取决于您获得的i
的值得到的切片串。对于string = 'ABCDEFGHI'
,这会打印:
ABC
DEF
GHI
当然,您可以删除带有变量的硬编码3
,例如gap = 3
,以使循环更具视觉效果:
gap = 3
for i in range(gap, len(string) + 1, gap):
print string[i-gap: i]
答案 1 :(得分:0)
你可以像这样创建一个生成器函数:
def trios(seq):
result = []
for e in seq:
result.append(e)
if len(result) == 3:
yield result
result = []
if result:
yield result
并像这样使用它:
>>> string = "ABCDEFGHIJ"
>>> [t for t in trios(string)]
[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I'], ['J', 'K']]
如果字符串不能被3整除,则最后一个元素将包含少于三个字符。如果你把它扔掉,你就可以像这样编写生成器:
def trios(seq):
result = []
for e in seq:
result.append(e)
if len(result) == 3:
yield result
result = []
答案 2 :(得分:0)
查看grouper
recipe on the itertools
文档。如上所述,它会返回tuple
s,而非新str
s,但它具有很大的适应性:
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return izip_longest(*args, fillvalue=fillvalue)
唯一的调整是包装最后一行,以便将tuple
s zip_longest
生成转换回str
:
return map(''.join, izip_longest(*args, fillvalue=fillvalue))