Inserisce un elemento in un indice specifico in un elenco e restituisce l'elenco aggiornato


99

Ho questo:

>>> a = [1, 2, 4]
>>> print a
[1, 2, 4]

>>> print a.insert(2, 3)
None

>>> print a
[1, 2, 3, 4]

>>> b = a.insert(3, 6)
>>> print b
None

>>> print a
[1, 2, 3, 6, 4]

C'è un modo per ottenere l'elenco aggiornato come risultato, invece di aggiornare l'elenco originale in posizione?


11
b = a[:].insert(2,3)sembra piuttosto breve, non influisce sull'elenco originale ed è piuttosto descrittivo.
mkoistinen

6
@mkoistinen Non funziona per me. >>> a = [1, 2, 3, 4] >>> b = a[:].insert(2, 5) >>> print b None
SparkAndShine

Risposte:


89

l.insert(index, obj)in realtà non restituisce nulla. Aggiorna solo l'elenco.

Come ha detto ATO, puoi farlo b = a[:index] + [obj] + a[index:]. Tuttavia, un altro modo è:

a = [1, 2, 4]
b = a[:]
b.insert(2, 3)

56
Se non puoi tollerare 3 righe di codice leggibile, inseriscilo in una funzione e chiamalo.
IceArdor

54

Approccio più efficiente in termini di prestazioni

Puoi anche inserire l'elemento utilizzando l' indicizzazione delle sezioni nell'elenco. Per esempio:

>>> a = [1, 2, 4]
>>> insert_at = 2  # Index at which you want to insert item

>>> b = a[:]   # Created copy of list "a" as "b".
               # Skip this step if you are ok with modifying the original list

>>> b[insert_at:insert_at] = [3]  # Insert "3" within "b"
>>> b
[1, 2, 3, 4]

Per inserire più elementi insieme in un dato indice , tutto ciò che devi fare è utilizzare uno listdegli elementi multipli che desideri inserire. Per esempio:

>>> a = [1, 2, 4]
>>> insert_at = 2   # Index starting from which multiple elements will be inserted

# List of elements that you want to insert together at "index_at" (above) position
>>> insert_elements = [3, 5, 6]

>>> a[insert_at:insert_at] = insert_elements
>>> a   # [3, 5, 6] are inserted together in `a` starting at index "2"
[1, 2, 3, 5, 6, 4]

Alternativa utilizzando la comprensione della lista (ma molto lenta in termini di prestazioni) :

In alternativa, può essere raggiunto utilizzando di lista con enumeratetroppo. (Ma per favore non farlo in questo modo. È solo a scopo illustrativo) :

>>> a = [1, 2, 4]
>>> insert_at = 2

>>> b = [y for i, x in enumerate(a) for y in ((3, x) if i == insert_at else (x, ))]
>>> b
[1, 2, 3, 4]

Confronto delle prestazioni di tutte le soluzioni

Ecco il timeitconfronto di tutte le risposte con l'elenco di 1000 elementi per Python 3.4.5:

  • La mia risposta utilizza l'inserimento a sezioni - Più veloce (3,08 µsec per loop)

     mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b[500:500] = [3]"
     100000 loops, best of 3: 3.08 µsec per loop
  • Risposta accettata di ATOzTOA basata sull'unione di elenchi suddivisi - Secondo (6,71 µsec per loop)

     mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:500] + [3] + a[500:]"
     100000 loops, best of 3: 6.71 µsec per loop
  • Risposta di Rushy Panchal con la maggior parte dei voti utilizzandolist.insert(...)- Terzo (26,5 usec per ciclo)

     python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b.insert(500, 3)"
     10000 loops, best of 3: 26.5 µsec per loop
  • La mia risposta con List Comprehension eenumerate- Fourth (molto lento con 168 µsec per loop)

     mquadri$ python3 -m timeit -s "a = list(range(1000))" "[y for i, x in enumerate(a) for y in ((3, x) if i == 500 else (x, )) ]"
     10000 loops, best of 3: 168 µsec per loop

2
Mi piace molto questo risultato perché si estende facilmente per risolvere il problema, e se volessi inserire i valori 3, 3.5in quella lista (in ordine) -> a[2:2] = [3,3.5]. Molto pulito
minillinim

1
Come funziona un [2: 2] = a_list? a [2: 2] sta fondamentalmente iniziando dal 2 ° indice al 1 ° indice (2-1) ma in avanti, il che significa una lista [] vuota. Come si estende? Se facciamo [2: 3: -1] non funziona.
SamCodes

Bella risposta. Mi chiedo se la complessità della scelta migliore sia O (1)? Se è così, perché?
Lerner Zhang

Questa risposta deve essere aggiornata. Per una volta non riesco a riprodurre i tempi riportati anche con Python 3.4 (ottengo un fattore 2 tra list.inserte assegnazione slice), e su Python 3.8 questa differenza è svanita completamente. Il modo più chiaro per inserire un elemento è list.insertovviamente quello di utilizzarlo .
a_guest

39

Il più corto che ho ottenuto: b = a[:2] + [3] + a[2:]

>>>
>>> a = [1, 2, 4]
>>> print a
[1, 2, 4]
>>> b = a[:2] + [3] + a[2:]
>>> print a
[1, 2, 4]
>>> print b
[1, 2, 3, 4]

Il numero di righe di codice non è una buona misura della qualità del codice. Questo approccio è difettoso sia per motivi di prestazioni che di leggibilità.
a_guest

0

L'approccio più pulito è copiare l'elenco e quindi inserire l'oggetto nella copia. Su Python 3 questo può essere fatto tramite list.copy:

new = old.copy()
new.insert(index, value)

Su Python 2 è possibile copiare l'elenco tramite new = old[:] (funziona anche su Python 3).

In termini di prestazioni non c'è differenza rispetto ad altri metodi proposti:

$ python --version
Python 3.8.1
$ python -m timeit -s "a = list(range(1000))" "b = a.copy(); b.insert(500, 3)"
100000 loops, best of 5: 2.84 µsec per loop
$ python -m timeit -s "a = list(range(1000))" "b = a.copy(); b[500:500] = (3,)"
100000 loops, best of 5: 2.76 µsec per loop

-1

Usa il metodo Python list insert () . Utilizzo:

#Sintassi

La sintassi per il metodo insert () -

list.insert(index, obj)

#Parameters

  • index - Questo è l'Indice in cui l'oggetto obj deve essere inserito.
  • obj - Questo è l'oggetto da inserire nell'elenco fornito.

#Return Value Questo metodo non restituisce alcun valore, ma inserisce l'elemento dato all'indice dato.

Esempio:

a = [1,2,4,5]

a.insert(2,3)

print(a)

ritorna [1, 2, 3, 4, 5]


2
Questo non risponde alla domanda.
Gustav Bertram

5
La domanda era specifica: la Is there anyway I can get the updated list as result, instead of updating the original list in place?tua risposta fa l'opposto.
Laszlowaty
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.