web-dev-qa-db-ja.com

ジェネレーターなどを介して、Pythonでイテレーターを無限にループさせるにはどうすればよいですか?

ジェネレーターを使用することがこのようなことを達成するための最良の方法であると私は理解していますが、私は提案を受け入れています。

具体的には、1つのユースケースは次のとおりです。必要に応じて最初のイテレータを切り捨てて、任意の長さの別のリストと一緒にいくつかのアイテムを印刷したいと思います。

これが動作しているpython私が望む正確な動作例を示すコード:

    def loop_list(iterable):
        """
        Return a Generator that will infinitely repeat the given iterable.

        >>> l = loop_list(['sam', 'max'])
        >>> for i in range(1, 11):
        ...     print i, l.next()
        ... 
        1 sam
        2 max
        3 sam
        4 max
        5 sam
        6 max
        7 sam
        8 max
        9 sam
        10 max

        >>> l = loop_list(['sam', 'max'])
        >>> for i in range(1, 2):
        ...     print i, l.next()
        ... 
        1 sam
        """
        iterable = Tuple(iterable)
        l = len(iterable)
        num = 0
        while num < l:
            yield iterable[num]
            num += 1
            if num >= l:
                num = 0

問題/私の質問

お気づきかもしれませんが、これは__getitem__を実装するリスト/タプル/イテラブルでのみ機能します(私が間違っていない場合)。理想的には、反復可能なものをすべて渡して、そのコンテンツを適切にループできるジェネレーターを受け取ることができるようにしたいと思います。

このようなことを行うためのより良い方法がある場合なしジェネレーター、私もそれで大丈夫です。

17

itertools.cycle (リンク先のページにソースが含まれています)。

import itertools

a = [1, 2, 3]

for element in itertools.cycle(a):
    print element

# -> 1 2 3 1 2 3 1 2 3 1 2 3 ...
59
Jon Gauthier

これを試して-

L = [10,20,30,40]

def gentr_fn(alist):
    while 1:
        for j in alist:
            yield j

a = gentr_fn(L)
print a.next()
print a.next()
print a.next()
print a.next()
print a.next()
print a.next()
print a.next()

>>gentr_fn(x,y)
10 20 30 40 10 20 30 ...
1
Arch