迭代三角形中的字符串

时间:2015-11-11 01:03:26

标签: python python-2.7 loops for-loop iteration

说我有字符串:

string = 'ABCDEFGHI'

我希望遍历字符串,以便输出:

ABC
DEF
GHI

这可行吗?我可以按照以下方式做点什么:

for i in string, 3:
  print i

我觉得我有一个更容易解决的问题。

3 个答案:

答案 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))