別のリスト/ジェネレーター/イテラブルからアイテムのストリームを取得してそれらをグループ化するジェネレーターを作成する良い方法を探しています。
アイテムの分割は簡単です。たとえば、ファイルの行を取り出して文字に分割したい場合:
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
私の意見では、それはきれいではありません。反復プロトコルの内部を使用しており、無限ループが抜け出しており、私にはよくわかりません。では、このタイプのコードをより適切に記述する方法を知っている人はいますか?
この特定の例ではなく、パターンを探していることに注意してください。私の場合、パケット間で分割されたパケット間で分割されたデータを読み取っていますが、各レベルは段落の例に似ています。