Python中的循环列表迭代器

use*_*854 86 python iterator list

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

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

有没有一种巧妙的方法在Python中做到这一点?

Luk*_*raf 137

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

from itertools import cycle

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

pool = cycle(lst)

for item in pool:
    print item,
Run Code Online (Sandbox Code Playgroud)

输出:

a b c a b c ...
Run Code Online (Sandbox Code Playgroud)

(显然是永远的循环)


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

>>> next(pool)
'a'
>>> next(pool)
'b'
Run Code Online (Sandbox Code Playgroud)

  • @fjsj这是正确的,在Python 3上你需要使用`next(iterator)`(BTW也可以在Python 2.x上正常工作,因此是应该使用的规范形式).请参阅[python 3.0中是否可见generator.next()?](http://stackoverflow.com/questions/1073396/is-generator-next-visible-in-python-3-0)以获得更深入的解释.相应更新了我的答案. (6认同)
  • @ user443854使用`pool.next()`来获取循环中的单个下一个项目 (5认同)
  • @ user443854 FWIW这是一个比我好得多的答案.没有理由去重新实现库函数! (4认同)
  • pool.next()不适合我,只有下一个(池).可能是因为Python 3? (4认同)
  • 您正在循环打印项目。我想离开循环并稍后回来?(我想从我离开的地方开始)。 (2认同)

Jac*_*all 45

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

使用发电机:

def circular():
    while True:
        for connection in ['a', 'b', 'c']:
            yield connection
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用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'
#....
Run Code Online (Sandbox Code Playgroud)

  • @juanchopanza:是的;`itertools.cycle` 是一个更好的答案。这显示了如果 `itertools` 不可用,你可以如何编写相同的功能:) (3认同)
  • @user443854 ‘while True’ 意味着永远重复 (2认同)
  • @dthor这个生成器创建一个包含三个元素并在其上识字的列表,然后永久地销毁列表并创建一个新列表.`cycle`的文档意味着输入iterable在它的生成器启动之前被转换为`list`,因为`iterable`只是"对于一组值的一次传递是好的". (2认同)

vik*_*pat 8

或者你可以这样做:

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

打印abcdefab c ...永远


lit*_*nce 5

你可以用append(pop())循环来完成这个:

l = ['a','b','c','d']
while True:
    print l[0]
    l.append(l.pop(0))
Run Code Online (Sandbox Code Playgroud)

for i in range()循环:

l = ['a','b','c','d']
ll = len(l)
while True:
    for i in range(ll):
       print l[i]
Run Code Online (Sandbox Code Playgroud)

或者干脆:

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

while True:
    for i in l:
       print i
Run Code Online (Sandbox Code Playgroud)

所有这些打印:

>>>
a
b
c
d
a
b
c
d
...etc.
Run Code Online (Sandbox Code Playgroud)

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

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

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

while True:
    servers = rotate_servers(servers)
    print servers[0]
Run Code Online (Sandbox Code Playgroud)