In Python, come faccio a spostare un elemento in un indice definito in un elenco?
In Python, come faccio a spostare un elemento in un indice definito in un elenco?
Risposte:
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))
last index + 1senza errori. In questo caso l'elemento viene semplicemente aggiunto all'elenco.
a.insert(99999, 1) In [14]: a Out[14]: [...., 1]
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]
l.append(l.pop(0)). È solo leggermente più lungo, ma è molto più leggibile.
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
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.
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]
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.