Spostare un elemento all'interno di un elenco?


104

In Python, come faccio a spostare un elemento in un indice definito in un elenco?

Risposte:


160

Usa il insertmetodo di un elenco:

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

In alternativa, puoi utilizzare una notazione slice:

l[index:index] = [item]

Se desideri spostare un elemento già presente nell'elenco nella posizione specificata, dovrai eliminarlo e inserirlo nella nuova posizione:

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

22
Tieni presente che spostare un elemento già in un elenco con il metodo insert / pop avrà un comportamento diverso a seconda se ti stai spostando verso la parte anteriore o posteriore dell'elenco. Spostandoti a sinistra inserisci prima l'oggetto che hai scelto. Spostandoti sul retro si inserisce dopo l'articolo che hai scelto. Verificare lo spostamento alla fine dell'elenco (errore di indice).
MKaras

Come spostare più elementi? Data una lista a = [1,2,3,4,5,6,7,8,9], come trasformarla in [1,2, [3,4,5], 6,7,8,9 ]? Questo può essere fatto in un unico passaggio o con una comprensione delle liste?
g33kz0r

@MKaras l'ho testato con Python 3.5 e puoi inserirlo last index + 1senza errori. In questo caso l'elemento viene semplicemente aggiunto all'elenco.
user2061057

@ user2061057 è corretto :) anche indici di grandi dimensioni comporteranno l'inserimento di elementi alla fine. a.insert(99999, 1) In [14]: a Out[14]: [...., 1]
lee penkman

1
Per coloro che stanno cercando di usare l'indice -1 per inserire l'elemento alla fine, devi usare invece len (l).
nda

31

Una soluzione leggermente più breve, che sposta l'elemento solo alla fine, non da nessuna parte è questa:

l += [l.pop(0)]

Per esempio:

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

13
Potresti anche usare l.append(l.pop(0)). È solo leggermente più lungo, ma è molto più leggibile.
coredumperror

Come potrei invece essere in grado di spostarlo all'inizio?

19

Se non conosci la posizione dell'articolo, potresti dover prima trovare l'indice:

old_index = list1.index(item)

quindi spostalo:

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

o IMHO in modo più pulito:

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

6
Penso di aver ragione a rabbrividire alla tua passaffermazione ... non nascondere mai le eccezioni - la cosa predefinita in un esempio come questo dovrebbe essere fornire una dichiarazione di errore più pulita o un'istruzione print ... raise ValueError(f'Unable to move item to {new_index}')o print(f'Moving item to {new_index} failed. List remains unchanged.'). Forse passsarebbe ok se in una funzione chiamata try_to_move_itemo qualcosa del genere si capisse che l'operazione potrebbe fallire silenziosamente.
flutefreak7

3

Una soluzione molto semplice, ma devi conoscere l'indice della posizione originale e l'indice della nuova posizione:

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

6
Questo è uno scambio, non una mossa.
juzzlin

0

Ho profilato alcuni metodi per spostare un elemento all'interno dello stesso elenco con timeit. Ecco quelli da usare se 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)) │
└──────────┴──────────────────────┘

e qui quelli da usare se 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.inserire (i, x [j]); del x [j] │
└──────────┴───────────────────────────┘

Non è una grande differenza se lo usi solo poche volte, ma se fai cose pesanti come lo smistamento manuale, è importante prendere quello più veloce. Altrimenti, consiglierei di prendere solo quello che ritieni più leggibile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.