Ho un numero intero e un elenco. Vorrei creare un nuovo elenco di essi che inizia con la variabile e termina con la lista. Scrittura a + list
Ottengo errori. Il compilatore gestisce a
come numero intero, quindi non posso usare append o estendere nessuno dei due. Come lo faresti?Aggiungi intero a inizio elenco in Python
risposta
>>> a = 5
>>> li = [1, 2, 3]
>>> [a] + li # Don't use 'list' as variable name.
[5, 1, 2, 3]
>>>var=7
>>>array = [1,2,3,4,5,6]
>>>array.insert(0,var)
>>>array
[7, 1, 2, 3, 4, 5, 6]
Come funziona:
array.insert(index, value)
inserire un elemento in una determinata posizione. Il primo argomento è l'indice dell'elemento prima del quale inserire, quindi gli inserimenti array.insert(0, x)
nella parte anteriore dell'elenco e array.insert(len(array), x)
equivale a array.append(x)
. I valori negativi vengono considerati come relativi alla fine dell'array.
L'approccio più efficiente. Più veloce di [x] + [y]. Vedi le soluzioni qui: http://stackoverflow.com/questions/8537916/whats-the-idiomatic-syntax-for-prepending-to-a-short-python-list –
La domanda afferma chiaramente che dovrebbe essere creata una nuova lista. Quindi potrebbe essere veloce, ma sbagliato. ;-) – BlackJack
@BlackJack La domanda riguarda come aggiungere un intero all'inizio della lista. Qualunque cosa descriva, non è la cosa giusta da seguire. Quindi, perché guidarlo a prendere la strada sbagliata? quando ci sono cose migliori che può fare per le sue necessità. – Nullify
Un altro modo di fare lo stesso,
list[0:0] = [a]
Non è necessario il primo 0. I due punti dicono già che è prima dell'inizio - my_list [: 0] = [a] lo fa. –
Soluzione elegante! – Shejo284
Si noti che se si sta cercando di fare questa operazione spesso, soprattutto nei cicli, una lista è la struttura di dati sbagliato.
Le liste non sono ottimizzate per le modifiche nella parte anteriore e somelist.insert(0, something)
è un O(n) operation.
somelist.pop(0)
e del somelist[0]
sono anche operazioni O (n).
La struttura dati corretta da utilizzare è un deque
dal modulo collections
. deques espongono un'interfaccia simile a quella degli elenchi, ma sono ottimizzati per le modifiche da entrambi gli endpoint. Hanno un metodo appendleft
per gli inserimenti nella parte anteriore.
Demo:
In [1]: lst = [0]*1000
In [2]: timeit -n1000 lst.insert(0, 1)
1000 loops, best of 3: 794 ns per loop
In [3]: from collections import deque
In [4]: deq = deque([0]*1000)
In [5]: timeit -n1000 deq.appendleft(1)
1000 loops, best of 3: 73 ns per loop
ho appena fatto un po 'di benchmarking. 'li.insert (0, a)' è circa 5 volte più veloce di 'li = [a] + li'. Tienilo a mente se lo fai più volte. –
@MarcelPfeiffer Si noti che 'li.insert (0, a)' sta mutando 'li'. 'li = [a] + li' sta creando una nuova istanza con tutti i valori. Questa è una distinzione importante se altre cose hanno un riferimento all'istanza dell'elenco. – unholysampler
Sarebbe carino per python aggiungere una funzione list.push_front (item). Questo sarà ovvio e meno soggetto a errori. –