Cabeza y cola en una línea.

¿Hay una forma en Pythonic para descomprimir una lista en el primer elemento y la “cola” en un solo comando?

Por ejemplo:

>> 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] 

Bajo Python 3.x, puedes hacer esto muy bien:

 >>> 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 nueva característica en 3.x es usar el operador * en el desempaquetado, para indicar cualquier valor extra. Se describe en PEP 3132 – Desembalaje extensible de Iterable . Esto también tiene la ventaja de trabajar en cualquier iterable, no solo en secuencias.

También es realmente legible.

Como se describe en el PEP, si desea hacer el equivalente en 2.x (sin hacer una lista temporal), debe hacer esto:

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

Naturalmente, si está trabajando en una lista, la forma más sencilla sin la syntax 3.x es:

 head, tail = seq[0], seq[1:] 
 >>> 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] 

Para O (1) la complejidad de la head,tail operación de la head,tail , debe utilizar deque sin embargo.

Siguiente manera:

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

Es útil cuando debe recorrer todos los elementos de la lista. Por ejemplo, en ingenuo fusionar 2 particiones en orden de fusión.

Python 2, usando 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] 

Sobre la base de la solución Python 2 de @GarethLatty , la siguiente es una forma de obtener un equivalente de una sola línea sin variables intermedias en Python 2.

 t=iter([1, 1, 2, 3, 5, 8, 13, 21, 34, 55]);h,t = [(h,list(t)) for h in t][0] 

Si necesita que sea a prueba de excepciones (es decir, que admite una lista vacía), agregue:

 t=iter([]);h,t = ([(h,list(t)) for h in t]+[(None,[])])[0] 

Si quieres hacerlo sin el punto y coma, usa:

 h,t = ([(h,list(t)) for t in [iter([1,2,3,4])] for h in t]+[(None,[])])[0]