0

別のリスト/ジェネレーター/イテラブルからアイテムのストリームを取得してそれらをグループ化するジェネレーターを作成する良い方法を探しています。

アイテムの分割は簡単です。たとえば、ファイルの行を取り出して文字に分割したい場合:

def lines2chars(filename):

    with open(filename) as fh:

        for line in fh:                 # Iterate over items
            for char in line:           # Split items up
                yield char              # Yield smaller items

たとえば、段落を作成するためにそれらをグループ化するのは難しいようです。これは私が思いついたものです:

def lines2para(filename):

    with fh as open(filename):
        paragraph = []                  # Start with an empty group

        while True:                     # Infinite loop to be ended by exception
            try:
                line = next(fh)         # Get a line
            except StopIteration as e:
                                        # If there isn't one...
                                        # do whatever necessary
                raise                   # and raise StopIteration for the caller
            else:
                paragraph.append(line)  # Add to the group of items
                if line == "\n":        # If we've got a whole group
                    yield paragraph     # yield it
                    paragraph = []      # and start a new group

私の意見では、それはきれいではありません。反復プロトコルの内部を使用しており、無限ループが抜け出しており、私にはよくわかりません。では、このタイプのコードをより適切に記述する方法を知っている人はいますか?

この特定の例ではなく、パターンを探していることに注意してください。私の場合、パケット間で分割されたパケット間で分割されたデータを読み取っていますが、各レベルは段落の例に似ています。

4

1 に答える 1

1
import itertools as it

def lines2para(filename):
    with open(filename) as fh:
        for k, v in it.groupby(fh, key=lambda x: bool(x.strip())):
            if k:
                yield list(v)
于 2012-04-12T09:03:36.770 に答える