Python中的循环列表迭代器

时间:2014-05-01 20:51:02

标签: python list iterator

每次从最后一次访问的项目开始,我需要迭代一个循环列表,可能很多次。

用例是连接池。客户端请求连接,迭代器检查指向的连接是否可用并返回它,否则循环直到找到可用的连接。

在Python中有没有一种巧妙的方法呢?

7 个答案:

答案 0 :(得分:120)

使用itertools.cycle,这是其确切目的:

from itertools import cycle

lst = ['a', 'b', 'c']

pool = cycle(lst)

for item in pool:
    print item,

输出:

a b c a b c ...

(显然是永远的循环)


为了手动推进迭代器并逐个拉取值,只需调用next(pool)

>>> next(pool)
'a'
>>> next(pool)
'b'

答案 1 :(得分:41)

正确答案是使用itertools.cycle。但是,我们假设库函数不存在。你会如何实现它?

使用generator

def circular():
    while True:
        for connection in ['a', 'b', 'c']:
            yield connection

然后,您可以使用for语句进行无限迭代,也可以调用next()从生成器迭代器中获取单个下一个值:

connections = circular()
next(connections) # 'a'
next(connections) # 'b'
next(connections) # 'c'
next(connections) # 'a'
next(connections) # 'b'
next(connections) # 'c'
next(connections) # 'a'
#....

答案 2 :(得分:7)

或者你可以这样做:

conn = ['a', 'b', 'c', 'c', 'e', 'f']
conn_len = len(conn)
index = 0
while True:
    print(conn[index])
    index = (index + 1) % conn_len

永久打印b c d e f a b c ...

答案 3 :(得分:2)

您可以使用append(pop())循环来完成此操作:

l = ['a','b','c','d']
while 1:
    print l[0]
    l.append(l.pop(0))

for i in range()循环:

l = ['a','b','c','d']
ll = len(l)
while 1:
    for i in range(ll):
       print l[i]

或简单地说:

l = ['a','b','c','d']

while 1:
    for i in l:
       print i

所有打印:

>>>
a
b
c
d
a
b
c
d
...etc.

这三个我倾向于将append(pop())方法作为函数

servers = ['a','b','c','d']

def rotate_servers(servers):
    servers.append(servers.pop(0))
    return servers

while 1:
    servers = rotate_servers(servers)
    print servers[0]

答案 4 :(得分:1)

你需要一个自定义迭代器 - 我将从this answer调整迭代器。

from itertools import cycle

class ConnectionPool():
    def __init__(self, ...):
        # whatever is appropriate here to initilize
        # your data
        self.pool = cycle([blah, blah, etc])
    def __iter__(self):
        return self
    def __next__(self):
        for connection in self.pool:
            if connection.is_available:  # or however you spell it
                return connection

答案 5 :(得分:1)

如果您希望循环n次,请实施ncycles itertools recipe

from itertools import chain, repeat


def ncycles(iterable, n):
    "Returns the sequence elements n times"
    return chain.from_iterable(repeat(tuple(iterable), n))

list(ncycles(["a", "b", "c"], 3))
# ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']

答案 6 :(得分:0)

为了避免无限循环,我仅使用数组的长度进行迭代,直到list的大小增加一倍。您可以实现自己的前提条件。想法是避免无限循环。

#Implement Circular Linked List
from itertools import cycle
list=[1,2,3,4,5]
lstlength=len(list)*2
print(lstlength)
pool=cycle(list)
i=0
#To avoid infinite loop break when you have iterated twice size of the list
for items in pool:
    print(items)
    if i >lstlength:
        break
    i += 1