голова и хвост питона в одной линии
есть ли питонический способ распаковать список в первом элементе и" хвост " в одной команде?
например:
>> 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]
5 ответов:
Под Python 3.X, вы можете сделать это красиво:
>>> head, *tail = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] >>> head 1 >>> tail [1, 2, 3, 5, 8, 13, 21, 34, 55]
новая функция в 3.x-это использовать
*
оператор в распаковке, чтобы иметь в виду любые дополнительные значения. Он описан в PEP 3132-Расширенная итерационная распаковка. Это также имеет преимущество работы с любыми итерационными, а не только последовательностями.кроме действительно читаем.
как описано в PEP, если вы хотите сделать эквивалент под 2.x (без потенциального создания временный список), вы должны сделать следующее:
it = iter(iterable) head = it.next() tail = list(it)
естественно, если вы работаете над списком, самый простой способ без 3.синтаксис x:
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]
для O (1) сложности
head,tail
операция, которую вы должны использоватьdeque
однако.следующим образом:
from collections import deque l = deque([1,2,3,4,5,6,7,8,9]) head, tail = l.popleft(), l
Это полезно, когда вы должны перебрать все элементы списка. Например, в наивном слиянии 2 раздела в сортировке слиянием.
в Python 2, используя лямбда
>>> 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]
дом на Python 2 Решение от @GarethLatty, ниже приведен способ получить эквивалент одной строки без промежуточных переменных в Python 2.
t=iter([1, 1, 2, 3, 5, 8, 13, 21, 34, 55]);h,t = [(h,list(t)) for h in t][0]
Если вам нужно, чтобы он был исключительным (т. е. поддерживал пустой список), то добавьте:
t=iter([]);h,t = ([(h,list(t)) for h in t]+[(None,[])])[0]
Если вы хотите сделать это без запятой, используйте:
h,t = ([(h,list(t)) for t in [iter([1,2,3,4])] for h in t]+[(None,[])])[0]