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

いくつかの反復可能(L)のイテレータしか取得できないと仮定できます。それは次のようであるでこのパターンをPythonイテレータを使って印刷する方法

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

私の試み: と我々はL. の長さを知ることができないのと反復可能を印刷することが可能ということです。

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は、イテラブルの項目を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 
+0

これは 'groupby'と' count'の非常に興味深いアプリケーションです。また、[this](http://stackoverflow.com/questions/24527006/split-a-generator-into-chunks-without-pre-walking-it)より一般的な質問への回答として投稿することもできます。 –

+0

現在の2つの回答の選択方法がわかりません。だから私はタイムチット。私は遅いコンピュータで1000回実行しました。 Koledoyeさんの答えは2.9803745844324028秒です。 tobias_kさんは8.567057737782685秒です。 – minion

+0

@tobias_kポインタをありがとう。答えを追加しました:http://stackoverflow.com/a/40063403/3125566 –

1

あなたがitertoolsforからchainsliceを使用して、3のsplit the iterator into chunksをすることができますループし、それらを結合します。 forループは、あなたのtry/while True/except構成のほとんどを行います。あなたのイテレータはちょうどlistある場合

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) 

しかし、あなただけのstepパラメータでrangeを使用することができます。

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) 
関連する問題