Duplicate possible:
moyen efficace de décaler une liste en python
J'aimerais faire pivoter une liste Python) par un nombre arbitraire d'éléments à droite ou à gauche (cette dernière à l'aide d'un argument négatif).
Quelque chose comme ça:
>>> l = [1,2,3,4]
>>> l.rotate(0)
[1,2,3,4]
>>> l.rotate(1)
[4,1,2,3]
>>> l.rotate(-1)
[2,3,4,1]
>>> l.rotate(4)
[1,2,3,4]
Comment ça pourrait être fait?
def rotate(l, n):
return l[-n:] + l[:-n]
Direction plus conventionnelle:
def rotate(l, n):
return l[n:] + l[:n]
Exemple:
example_list = [1, 2, 3, 4, 5]
rotate(example_list, 2)
# [3, 4, 5, 1, 2]
Les arguments de rotate
sont une liste et un entier indiquant le décalage. La fonction crée deux nouvelles listes en utilisant slicing et retourne la concaténaténation de ces listes. La fonction rotate
ne modifie pas la liste des entrées.
Le cas échéant, vous pouvez utiliser collections.deque
comme solution:
import collections
d = collections.deque([1,2,3,4,5])
d.rotate(3)
print d
>>> deque([3, 4, 5, 1, 2])
En prime, je m'attendrais à ce que ce soit plus rapide que la liste intégrée.
La fonction suivante fera tourner la liste l
, x
espaces à droite:
def rotate(l, x):
return l[-x:] + l[:-x]
Notez que ceci ne renverra la liste d'origine que si x
est en dehors de la plage [-len(l), len(l)]
. Pour que cela fonctionne pour toutes les valeurs de x
, utilisez:
def rotate(li, x):
return li[-x % len(li):] + li[:-x % len(li)]
>>> l=[1,2,3,4]
>>> l[1:]+l[:1]
[2, 3, 4, 1]
>>> l=[1,2,3,4]
>>> l[2:]+l[:2]
[3, 4, 1, 2]
>>> l[-1:]+l[:-1]
[4, 1, 2, 3]
Une rotation générale n
à gauche (y positif dans l'appel à rotate
) ou à droite (y négatif) puis:
def rotate(l, y=1):
if len(l) == 0:
return l
y = y % len(l) # Why? this works for negative y
return l[y:] + l[:y]
Si vous voulez que le sens de rotation soit identique à celui de votre exemple, il suffit d’annuler y
en rotation.
def rotate(l, y=1):
if len(l) == 0:
return l
y = -y % len(l) # flip rotation direction
return l[y:] + l[:y]