2016-10-15 79 views
0
L = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
head = 'head' 
tail = 'tail' 

假設我們可以並且只能得到某個迭代器(L)的迭代器。 ,我們無法知道L. 的長度是可以打印迭代爲:如何使用Python迭代器打印此模式

'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

你必須要緩衝自己的「頭」,並將其打印僅次於後已經成功了,因爲你無法預測迭代器中的下一個內容而不消耗它。 –

+0

@ Jacques,謝謝你的建議。我修改我的初步問題。 – minion

回答

2

下面是與itertools.groupbyitertools.count做到這一點的方法之一。

groupby關鍵功能lambda _: next(c)//3將迭代項中的項目分組編號爲三項。該邏輯使用在計數項目的下一個對象的對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 
+0

這是'groupby'和'count'非常有趣的應用程序。您也可以將此作爲對[此](http://stackoverflow.com/questions/24527006/split-a-generator-into-chunks-without-pre-walking-it)更多一般問題的答案發布。 –

+0

我不知道如何選擇當前的兩個答案。所以我'時間'。我在慢速計算機上將它們運行了1000次。 Koledoye的回答得到2.9803745844324028秒; tobias_k的時間是8.567057737782685秒。 – minion

+0

@tobias_k感謝您的指針。添加了一個答案:http://stackoverflow.com/a/40063403/3125566 –

1

可以在三種的split the iterator into chunks,使用從itertoolschainslicefor循環,然後加入它們。 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,你可以只使用rangestep參數:

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)