2013-07-28 2 views
222

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

308
>>> a = 5 
>>> li = [1, 2, 3] 
>>> [a] + li # Don't use 'list' as variable name. 
[5, 1, 2, 3] 
+199

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. –

+47

@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

+1

Sarebbe carino per python aggiungere una funzione list.push_front (item). Questo sarà ovvio e meno soggetto a errori. –

330
>>>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.

+5

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 –

+0

La domanda afferma chiaramente che dovrebbe essere creata una nuova lista. Quindi potrebbe essere veloce, ma sbagliato. ;-) – BlackJack

+0

@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

29

Un altro modo di fare lo stesso,

list[0:0] = [a] 
+16

Non è necessario il primo 0. I due punti dicono già che è prima dell'inizio - my_list [: 0] = [a] lo fa. –

+0

Soluzione elegante! – Shejo284

47

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