2

Python にジェネレーターがあり、最初の 10 回の反復と最後の 10 回の反復を除いて、その中のすべてを反復処理したいとします。itertools.islice は、このスライス操作の最初の部分をサポートしていますが、2 番目の部分はサポートしていません。これを達成する簡単な方法はありますか?

4

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 に答える