Existe uma maneira pythônica de desempacotar uma lista no primeiro elemento e a "cauda" em um único comando?
Por exemplo:
>> 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]
Respostas:
No Python 3.x, você pode fazer isso muito bem:
Um novo recurso no 3.x é usar o
*
operador na descompactação, para significar quaisquer valores extras. É descrito em PEP 3132 - Desempacotamento Iterável Estendido . Isso também tem a vantagem de trabalhar em qualquer iterável, não apenas em sequências.Também é muito legível.
Conforme descrito no PEP, se você quiser fazer o equivalente em 2.x (sem potencialmente fazer uma lista temporária), você deve fazer o seguinte:
Conforme observado nos comentários, isso também fornece uma oportunidade de obter um valor padrão para, em
head
vez de lançar uma exceção. Se você deseja este comportamento,next()
recebe um segundo argumento opcional com um valor padrão, entãonext(it, None)
forneceriaNone
se não houvesse elemento head.Naturalmente, se você estiver trabalhando em uma lista, a maneira mais fácil sem a sintaxe 3.x é:
fonte
__getitem__
/__setitem__
para fazer a operação final preguiçosamente, mas a lista interna não o faz.python 3.x
fonte
No entanto, para complexidade de
head,tail
operação O (1) , você deve usardeque
.Caminho seguinte:
É útil quando você deve iterar por todos os elementos da lista. Por exemplo, na mesclagem ingênua de 2 partições na classificação de mesclagem.
fonte
head, tail = l.popleft(), l
é ~ O (1).head, tail = seq[0], seq[1:]
é O (n).head = l.popleft()
etail
é apenas um apelido paral
. Sel
astail
mudanças também mudarem.Python 2, usando lambda
fonte
head, tail = lst[0], lst[1:]
? se OP significa usar um literal então ele poderia dividir cabeça e cauda manualmentehead, tail = 1, [1, 2, 3, 5, 8, 13, 21, 34, 55]
lst = ...
na linha anterior). (2) Fazerhead, tail = lst[0], lst[1:]
deixa o código aberto a efeitos colaterais (considerehead, tail = get_list()[0], get_list()[1:]
) e é diferente da forma de Ophead, tail = **some_magic applied to** [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
.Com base na solução Python 2 de @GarethLatty , o seguinte é uma maneira de obter um equivalente de linha única sem variáveis intermediárias em Python 2.
Se você precisa que seja à prova de exceção (ou seja, suporte para lista vazia), adicione:
Se você quiser fazer isso sem o ponto-e-vírgula, use:
fonte