2012-05-10 24 views
60

Esiste un modo pietonico di decomprimere una lista nel primo elemento e la "coda" in un unico comando?python testa e coda in una riga

Ad esempio:

>> head, tail = **some_magic applied to** [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] 
>> head 
1 
>>> tail 
[1, 2, 3, 5, 8, 13, 21, 34, 55] 
+7

Ricordare che gli elenchi non sono implementati come elenchi a collegamento singolo in Python, quindi questa operazione è costosa (come in: l'intera lista deve essere copiata). A seconda di ciò che si vuole raggiungere, questo potrebbe o potrebbe non essere un problema. Sto solo citando questo perché questo tipo di elenco di destrutturazione si trova spesso nei linguaggi funzionali, dove è in realtà un'operazione molto economica. –

risposta

126

Sotto Python 3.x, è possibile farlo bene:

>>> head, *tail = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] 
>>> head 
1 
>>> tail 
[1, 2, 3, 5, 8, 13, 21, 34, 55] 

Una nuova funzionalità di 3.x è quello di utilizzare l'operatore * in disimballaggio, a significa qualsiasi valore extra. È descritto in PEP 3132 - Extended Iterable Unpacking. Questo ha anche il vantaggio di lavorare su qualsiasi sequenza iterabile, non solo.

È anche veramente leggibile.

Come descritto nella PEP, se si vuole fare l'equivalente sotto 2.x (senza potenzialmente fare un elenco provvisorio), si hanno a che fare questo:

it = iter(iterable) 
head = it.next() 
tail = list(it) 

Naturalmente, se si sta lavorando un elenco, il modo più semplice, senza la sintassi 3.x è:

head, tail = seq[0], seq[1:] 
+1

scusate, ho usato il termine coda in modo non corretto. Intendo quello che dico nell'esempio, cioè la lista senza il primo elemento –

+0

@ Giacomod'Antonio Errore mio, non ho letto abbastanza da vicino. Quello che hai detto è il normale significato della coda. In realtà, questo lo rende ancora più semplice. –

+0

+1 per soluzioni Python 2.xe 3.x – Patrick

31
>>> mylist = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] 
>>> head, tail = mylist[0], mylist[1:] 
>>> head 
1 
>>> tail 
[1, 2, 3, 5, 8, 13, 21, 34, 55] 
3

Python 2, utilizzando lambda

>>> head, tail = (lambda lst: (lst[0], lst[1:]))([1, 1, 2, 3, 5, 8, 13, 21, 34, 55]) 
>>> head 
1 
>>> tail 
[1, 2, 3, 5, 8, 13, 21, 34, 55] 
6

Per la complessità O (1) del head,tail è necessario utilizzare deque.

seguente modo:

from collections import deque 
l = deque([1,2,3,4,5,6,7,8,9]) 
head, tail = l.popleft(), l 

E 'utile quando è necessario scorrere tutti gli elementi della lista. Ad esempio in naive unendo 2 partizioni in un merge sort.

+0

Sembra che deque (list_instance) abbia complessità O (N). Ho sbagliato? –

+1

@ НикитаКонин, hai ragione riguardo alla costruzione di deque. Tuttavia, se si desidera accedere al primo elemento più di una volta, quindi 'head, tail = l.popleft(), l' è ~ O (1). 'testa, coda = seq [0], seq [1:]' è O (n). –

Problemi correlati