голова и хвост питона в одной линии


есть ли питонический способ распаковать список в первом элементе и" хвост " в одной команде?

например:

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

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]