Je dois parcourir une liste circulaire, peut-être plusieurs fois, chaque fois en commençant par le dernier élément visité.
Le cas d'utilisation est un pool de connexions. Un client demande une connexion, un itérateur vérifie si la connexion pointée est disponible et la renvoie, sinon boucle jusqu'à ce qu'il en trouve une disponible.
Existe-t-il un moyen efficace de le faire en Python?
pool.next()
pour obtenir l'élément suivant du cyclenext(iterator)
(ce qui fonctionne également très bien BTW sur Python 2.x, et est donc la forme canonique à utiliser). Voir Generator.next () est-il visible dans Python 3.0? pour une explication plus approfondie. J'ai mis à jour ma réponse en conséquence.La bonne réponse est d'utiliser itertools.cycle . Mais supposons que la fonction de bibliothèque n'existe pas. Comment le mettriez-vous en œuvre?
Utilisez un générateur :
Ensuite, vous pouvez soit utiliser une
for
instruction pour itérer à l'infini, soit appelernext()
pour obtenir la valeur suivante unique de l'itérateur du générateur:la source
while True
moyen de répéter pour toujoursitertools.cycle
est une meilleure réponse. Cela montre comment vous pouvez écrire la même fonctionnalité si elleitertools
n'est pas disponible :)itertools.cycle
fait? Ou le générateur simple serait-il une conception plus efficace en mémoire? Par lacycle
documentation :Note, this member of the toolkit may require significant auxiliary storage (depending on the length of the iterable).
cycle
implique que l'entrée itérable est convertie enlist
avant que son générateur ne démarre, car elleiterable
n'est "bonne que pour un passage sur l'ensemble de valeurs".Ou vous pouvez faire comme ceci:
imprime abcdefab c ... pour toujours
la source
vous pouvez accomplir cela avec
append(pop())
loop:ou
for i in range()
boucle:ou simplement:
tous imprimés:
des trois je serais enclin à l'approche append (pop ()) en tant que fonction
la source
Vous avez besoin d'un itérateur personnalisé - je vais adapter l'itérateur à partir de cette réponse .
la source
Si vous souhaitez faire des cycles de
n
temps, appliquez lancycles
recette itertools :la source