Preciso iterar em uma lista circular, possivelmente muitas vezes, sempre começando com o último item visitado.
O caso de uso é um pool de conexão. Um cliente pede uma conexão, um iterador verifica se a conexão apontada está disponível e a retorna, caso contrário, faz um loop até encontrar uma disponível.
Existe uma maneira legal de fazer isso em Python?
pool.next()
para obter o próximo item único do ciclonext(iterator)
(que BTW também funciona bem no Python 2.x e, portanto, é a forma canônica que deve ser usada). Consulte O generator.next () é visível no python 3.0? para uma explicação mais aprofundada. Atualizei minha resposta em conformidade.A resposta correta é usar itertools.cycle . Mas, vamos supor que a função de biblioteca não exista. Como você o implementaria?
Use um gerador :
Em seguida, você pode usar uma
for
instrução para iterar infinitamente ou chamarnext()
para obter o próximo valor único do iterador gerador:fonte
while True
meio de repetir para sempreitertools.cycle
é uma resposta melhor. Isso mostra como você pode escrever a mesma funcionalidade seitertools
não estiver disponível :)itertools.cycle
faz? Ou o gerador simples teria um design mais eficiente em termos de memória? De acordo com oscycle
documentos :Note, this member of the toolkit may require significant auxiliary storage (depending on the length of the iterable).
cycle
implica que o iterável de entrada é convertido paralist
antes de seu gerador iniciar, uma vez queiterable
só é "bom para uma passagem sobre o conjunto de valores".Ou você pode fazer assim:
imprime abcdefab c ... para sempre
fonte
você pode fazer isso com o
append(pop())
loop:ou
for i in range()
loop:ou simplesmente:
todas impressas:
dos três, estaria propenso à abordagem append (pop ()) como uma função
fonte
Você precisa de um iterador personalizado - adaptarei o iterador a partir desta resposta .
fonte
Se você deseja ciclos de
n
tempos, implemente ancycles
receita de itertools :fonte