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