Quel est le moyen le plus efficace de faire tourner une liste en python ? Pour l'instant, j'ai quelque chose comme ça :
>>> def rotate(l, n):
... return l[n:] + l[:n]
...
>>> l = [1,2,3,4]
>>> rotate(l,1)
[2, 3, 4, 1]
>>> rotate(l,2)
[3, 4, 1, 2]
>>> rotate(l,0)
[1, 2, 3, 4]
>>> rotate(l,-1)
[4, 1, 2, 3]
Y a-t-il un meilleur moyen ?
15 votes
Ce n'est pas vraiment un déplacement car les autres langages (Perl, Ruby) utilisent ce terme. Il s'agit de rotate. La question devrait peut-être être modifiée en conséquence ?
0 votes
@dzhelil J'aime beaucoup votre solution originale car elle n'introduit pas de mutations.
2 votes
numpy.roll
2 votes
Je pense
rotate
est le mot juste, et nonshift
.5 votes
Le site réel La bonne réponse est que vous ne devriez jamais faire tourner la liste en premier lieu. Créez une variable "pointeur" à l'endroit logique de votre liste où vous voulez que la "tête" ou la "queue" soit, et modifiez cette variable au lieu de déplacer les éléments de la liste. Recherchez l'opérateur "modulo" % pour trouver le moyen efficace d'"enrouler" votre pointeur autour du début et de la fin de la liste.
0 votes
En fonction de la fréquence des rotations et de la fréquence des itérations, une seule rotation "réelle" peut s'avérer plus efficace que le calcul répété des indices de cette manière. Comme demandé, il s'agit de la méthode seulement pour faire pivoter la liste. Que la liste besoins ou si une structure de données différente doit être utilisée, il n'est pas possible de répondre à ces questions sans plus de contexte.
0 votes
Traiter également correctement les cas où
n > len(l)
(c'est-à-dire une rotation de plus de 360°, pour ainsi dire),rotate
doit d'abord fairen = n % len(l)
0 votes
@cnd Votre suggestion fonctionne-t-elle également si la liste doit être passée à des modules python que nous ne pouvons pas modifier ?