38

据我了解,使用生成器是实现此类目标的最佳方式,但我愿意接受建议。

具体来说,一个用例是这样的:我想在另一个列表旁边打印一些项目,任意长度,必要时截断初始迭代器。

这是演示我想要的确切示例行为的工作 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__(如果我没记错的话)。理想情况下,我希望能够传递任何可迭代对象,并接收一个可以正确循环其内容的生成器。

如果有更好的方法可以在没有生成器的情况下执行此类操作,我也可以。

4

4 回答 4

89

您可以使用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 ...
于 2012-10-17T23:23:51.453 回答
6

试试这个-

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 ...
于 2019-05-02T15:09:01.417 回答
1

您可以使用模块来保持简单。只要确保不要从 0 开始迭代。


my_list = ['sam', 'max']

for i in range(1, 100):
    print(my_list[(i % len(my_list))-1])


于 2021-03-10T14:29:48.170 回答
-5

您可以遍历一个列表,将一个项目附加到它:

somelist = [item1, item2, item3]
for item in somelist:
    somelist.append(item)
    do_something()
于 2016-02-25T12:28:25.760 回答