Pythonイテレータを逆方向に動かすには?質問する

Pythonイテレータを逆方向に動かすには?質問する

Python リスト反復子を後戻りさせる方法はありますか?

基本的に私はこれを持っています

class IterTest(object):
    def __init__(self, data):
        self.data = data
        self.__iter = None

    def all(self):
        self.__iter = iter(self.data)
        for each in self.__iter:
            mtd = getattr(self, type(each).__name__)
            mtd(each)

    def str(self, item):
        print item

        next = self.__iter.next()
        while isinstance(next, int):
            print next
            next = self.__iter.next()

    def int(self, item):
        print "Crap i skipped C"

if __name__ == '__main__':
    test = IterTest(['a', 1, 2,3,'c', 17])
    test.all()

このコードを実行すると、出力は次のようになります。

a
1
2
3
Crap i skipped C

なぜ出力が返されるのかはわかっていますが、str() メソッドで 1 ステップずつ戻る方法はありますか?

編集

分かりやすくするために、私は完全な逆転をしたいのではなく、基本的に、それと同等のことをする簡単な方法があるかどうかを知りたいのです。双方向Python の反復子?

ベストアンサー1

いいえ、一般的には Python イテレータを後戻りさせることはできません。ただし、1 回だけ戻りたい場合は、次のようにしてください。

def str(self, item):
    print item

    prev, current = None, self.__iter.next()
    while isinstance(current, int):
        print current
        prev, current = current, self.__iter.next()

その後、いつでも前の要素にアクセスできるようになりますprev

双方向イテレータが本当に必要な場合は、自分で実装することもできますが、上記のソリューションよりもさらに多くのオーバーヘッドが発生する可能性があります。

class bidirectional_iterator(object):
    def __init__(self, collection):
        self.collection = collection
        self.index = 0

    def next(self):
        try:
            result = self.collection[self.index]
            self.index += 1
        except IndexError:
            raise StopIteration
        return result

    def prev(self):
        self.index -= 1
        if self.index < 0:
            raise StopIteration
        return self.collection[self.index]

    def __iter__(self):
        return self

おすすめ記事