En Python, comment déplacer un élément vers un index défini dans une liste?
En Python, comment déplacer un élément vers un index défini dans une liste?
Réponses:
Utilisez la insert
mé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))
last index + 1
sans erreur. L'élément est simplement ajouté à la liste dans ce cas.
a.insert(99999, 1)
In [14]: a
Out[14]: [...., 1]
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]
l.append(l.pop(0))
. Ce n'est que légèrement plus long, mais c'est beaucoup plus lisible.
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
pass
dé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 pass
serait peut -être correct si dans une fonction appelée try_to_move_item
ou quelque chose comme ça, il comprend que l'opération peut échouer en silence.
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]
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.