Déplacer un élément dans une liste?


104

En Python, comment déplacer un élément vers un index défini dans une liste?

Réponses:


160

Utilisez la insertméthode d'une liste:

l = list(...)
l.insert(index, item)

Vous pouvez également utiliser une notation de tranche:

l[index:index] = [item]

Si vous souhaitez déplacer un élément qui se trouve déjà dans la liste vers la position spécifiée, vous devez le supprimer et l'insérer à la nouvelle position:

l.insert(newindex, l.pop(oldindex))

22
Gardez simplement à l'esprit que déplacer un élément déjà dans une liste avec la méthode insert / pop aura un comportement différent selon si vous vous déplacez vers l'avant ou l'arrière de la liste. En vous déplaçant vers la gauche, vous insérez avant l'objet que vous avez choisi. En vous déplaçant vers l'arrière, vous insérez après l'élément que vous avez choisi. Vérifiez si vous passez à la fin de la liste (erreur d'index).
MKaras

Comment déplacer plusieurs éléments? Étant donné une liste a = [1,2,3,4,5,6,7,8,9], comment la transformer en [1,2, [3,4,5], 6,7,8,9 ]? Cela peut-il être fait en une seule étape ou avec une compréhension de liste?
g33kz0r

@MKaras J'ai testé cela avec Python 3.5 et vous POUVEZ insérer last index + 1sans erreur. L'élément est simplement ajouté à la liste dans ce cas.
user2061057

@ user2061057 est correct :) même les gros index entraîneront l'insertion d'éléments à la fin. a.insert(99999, 1) In [14]: a Out[14]: [...., 1]
lee penkman

1
Pour ceux qui essaient d'utiliser l'index -1 pour insérer l'élément à la fin, vous devez utiliser len (l) à la place.
nda

31

Une solution légèrement plus courte, qui ne déplace l'élément que vers la fin, pas n'importe où:

l += [l.pop(0)]

Par exemple:

>>> l = [1,2,3,4,5]
>>> l += [l.pop(0)]
>>> l
[2, 3, 4, 5, 1]

13
Vous pourriez aussi bien utiliser l.append(l.pop(0)). Ce n'est que légèrement plus long, mais c'est beaucoup plus lisible.
coredumperror

Comment pourrais-je être en mesure de le déplacer au début à la place?

19

Si vous ne connaissez pas la position de l'élément, vous devrez peut-être d'abord trouver l'index:

old_index = list1.index(item)

puis déplacez-le:

list1.insert(new_index, list1.pop(old_index))

ou à mon humble avis d'une manière plus propre:

try:
  list1.remove(item)
  list1.insert(new_index, item)
except ValueError:
  pass

6
Je pense que j'ai raison de grincer des dents à votre passdéclaration ... ne cachez jamais les exceptions - la chose par défaut dans un exemple comme celui-ci devrait être de fournir une déclaration d'erreur plus propre ou une déclaration imprimée ... raise ValueError(f'Unable to move item to {new_index}')ou print(f'Moving item to {new_index} failed. List remains unchanged.'). Ce passserait peut -être correct si dans une fonction appelée try_to_move_itemou quelque chose comme ça, il comprend que l'opération peut échouer en silence.
flutefreak7

3

Une solution très simple, mais il faut connaître l'index de la position d'origine et l'index de la nouvelle position:

list1[index1],list1[index2]=list1[index2],list1[index1]

6
C'est un échange, pas un mouvement.
juzzlin

0

J'ai profilé quelques méthodes pour déplacer un élément dans la même liste avec timeit. Voici ceux à utiliser si j> i:

┌──────────┬───────────────────────┐
│ 14,4usec │ x [i: i] = x.pop (j), │
│ 14,5usec │ x [i: i] = [x.pop (j)] │
│ 15.2usec │ x.insert (i, x.pop (j)) │
└──────────┴───────────────────────┘

et voici ceux à utiliser si j <= i:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
│ 14,4usec │ x [i: i] = x [j] ,; del x [j] │
│ 14,4usec │ x [i: i] = [x [j]]; del x [j] │
│ 15,4usec │ x.insert (i, x [j]); del x [j] │
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Ce n'est pas une énorme différence si vous ne l'utilisez que quelques fois, mais si vous faites des choses lourdes comme le tri manuel, il est important de choisir le plus rapide. Sinon, je vous recommande de prendre celui qui vous semble le plus lisible.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.