Rotation de la liste Python [dupliquer]
possibilité de dupliquer:
manière efficace de changer une liste en python
j'aimerais faire tourner une liste Python par un nombre arbitraire d'éléments à droite ou à gauche (ce dernier en utilisant 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 faire?
4 réponses
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 dénotant le décalage. La fonction crée deux nouvelles listes en utilisant tranchant et retourne la concaténation de ces listes. La fonction rotate
ne modifie pas la liste des entrées.
si applicable, 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'attendais à ce qu'il soit plus rapide que la liste.
la fonction suivante fera tourner la liste l
, x
espaces vers la droite:
def rotate(l, x):
return l[-x:] + l[:-x]
notez que cela ne retournera la liste originale que si x
est en dehors de la gamme [-len(l), len(l)]
. Pour faire fonctionner 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 la direction de rotation soit la même que votre exemple, il suffit de nier 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]