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?

68
demandé sur Community 2012-02-27 02:27:14

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.

130
répondu YXD 2017-05-23 10:31:17

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.

87
répondu tomasz 2015-02-19 17:21:17

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)]
16
répondu Aaron Dufour 2017-12-14 14:29:11
>>> 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]
6
répondu the wolf 2012-02-26 23:00:02