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.