Python にジェネレーターがあり、最初の 10 回の反復と最後の 10 回の反復を除いて、その中のすべてを反復処理したいとします。itertools.islice は、このスライス操作の最初の部分をサポートしていますが、2 番目の部分はサポートしていません。これを達成する簡単な方法はありますか?
2 に答える
2
このようなものが仕事をするかもしれません。編集: コメントに従って deque の使用を追加しました。
from collections import deque
def generator():
for i in ['ignore'] * 10 + ['yield this'] * 10 + ['ignore'] * 10:
yield i
def func(mygenerator):
cache = deque()
for i, item in enumerate(mygenerator()):
if i < 10:
continue
cache.appendleft(item)
if len(cache) > 10:
yield cache.pop()
for i in func(generator):
print i
于 2013-10-06T20:21:41.217 に答える
1
単純な方法がないだけでなく、任意のジェネレーター (または任意のイテラブル) を許可する場合、方法がまったくありません。一般に、ジェネレーターの最後から 10 アイテムになったとき、またはジェネレーターが終了したかどうかを知る方法はありません。ジェネレーターは一度に 1 つのアイテムしか提供せず、「残っている」アイテムの数については何も教えてくれません。ジェネレーター全体を反復処理し、最新の 10 個のアイテムの一時キャッシュを保持してから、ジェネレーターが終了したとき (または終了した場合) にそれらを生成する必要があります。
「または場合」に注意してください。ジェネレーターは有限である必要はありません。無限ジェネレーターの場合、「最後の」10 個の要素などはありません。
于 2013-10-06T20:07:16.577 に答える