如何使用python迭代器打印此模式

时间:2016-10-15 18:16:01

标签: python

L = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
head = 'head'
tail = 'tail'

假设我们能够并且只能获得某些可迭代(L)的迭代器。 我们无法知道L.的长度 是否可以将iterable打印为:

'head123tail'
'head456tail' 
'head789tail' 
'head10tail'

我的尝试如下。

L = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
head = 'head'
tail = 'tail'
slice_size = 3

i = iter(L)
try:
    while True:
        counter = 0
        while counter < slice_size:
            e = next(i)
            if counter == 0:
                print(head, end='')
            print(e, end='')
            counter += 1
        else:
            print(tail)
except StopIteration:
    if counter > 0:
        print(tail)

2 个答案:

答案 0 :(得分:2)

以下是使用itertools.groupbyitertools.count执行此操作的一种方法。

关键函数groupby上的

lambda _: next(c)//3 threes 中迭代物中的项目连续分组。逻辑使用3上计数项中下一个对象的整数除法:

from itertools import groupby, count

L = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
head = 'head'
tail = 'tail'

c = count()    
for _, g in groupby(L, lambda _: next(c)//3):
    item = head + ''.join(map(str, g)) + tail
    print(item)

输出

head123tail
head456tail
head789tail
head10tail

答案 1 :(得分:1)

您可以使用chain中的sliceitertools以及for循环来split the iterator into chunks三个,然后加入它们。 for循环将执行try/while True/except构造正在执行的操作的大部分内容。

L = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
head = 'head'
tail = 'tail'
slice_size = 3
iterator = iter(L)

from itertools import chain, islice
for first in iterator:
    chunk = chain([first], islice(iterator, slice_size - 1))
    print(head, ''.join(str(x) for x in chunk), tail)

但是,如果您的迭代器只是list,则可以range使用step参数:

for start in range(0, len(L), slice_size):
    chunk = L[start : start + slice_size]
    print(head, ''.join(str(x) for x in chunk), tail)