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)
答案 0 :(得分:2)
以下是使用itertools.groupby
和itertools.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
中的slice
和itertools
以及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)