三次迭代一个字符串

Iterating Over a String in Threes

假设我有字符串:

string = 'ABCDEFGHI'

我想遍历字符串,因此输出将是:

ABC
DEF
GHI

这可行吗?我可以按照以下方式做一些事情吗:

for i in string, 3:
  print i

我觉得我缺少一个更简单的解决方案。

完成此操作的简单 for 循环是:

for i in range(3, len(string) + 1, 3): 
    print string[i-3:i]

它使用 step=3 value for range() to iterate by 3's and then, utilizing a slice 对象,该对象取决于 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] 

您可以像这样创建一个生成器函数:

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']]

如果字符串不能被三整除,则最终元素将包含少于三个字符。如果你宁愿把它们扔掉,你可以这样写生成器:

def trios(seq):
    result = []
    for e in seq:
        result.append(e)
        if len(result) == 3:
            yield result
            result = []

查看 grouper recipe on the itertools 文档。如所写,它 returns tuples,不是新的 strs,但它的适应性很简单:

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)

唯一的调整是包装最后一行,使其将 tuples zip_longest 的结果转换回 str:

    return map(''.join, izip_longest(*args, fillvalue=fillvalue))