web-dev-qa-db-fra.com

Python rotation de la liste

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?

74
Drew Noakes
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.

149
YXD

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.

96
tomasz

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)]
21
Aaron Dufour
>>> 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]
7
the wolf