4

反復可能なオブジェクトから一度に複数のアイテムを生成するにはどうすればよいですか?

たとえば、任意の長さのシーケンスで、反復ごとにX個の連続するアイテムのグループで、シーケンス内のアイテムを反復処理するにはどうすればよいですか?

4

2 に答える 2

7

あなたの質問は少し曖昧ですが、ドキュメントのgrouperレシピをチェックしてください。itertools

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

(同じイテレータを数回圧縮するの[iter(iterable)]*nは古いトリックですが、この関数にカプセル化することでコードの混乱を避けることができ、多くの人が使用するのとまったく同じ形式とインターフェイスです。これはやや一般的なニーズであり、少し残念です。実際にはitertoolsモジュールに含まれていません。)

于 2010-02-04T19:17:22.690 に答える
2

izip_longestを持たない古いバージョンのPythonで機能する別のアプローチは次のとおりです。

def grouper(n, seq):
  result = []
  for x in seq:
    result.append(x)
    if len(result) >= n:
      yield tuple(result)
      del result[:]
  if result:
    yield tuple(result)

フィラーがないため、最後のグループの要素数はn未満である可能性があります。

于 2010-02-04T20:32:21.260 に答える