python头部和尾部在一条线上

Gia*_*nio 81 python list tail head

有没有pythonic方法解压缩第一个元素中的列表和单个命令中的"尾部"?

例如:

>> 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]
Run Code Online (Sandbox Code Playgroud)

Gar*_*tty 175

在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]
Run Code Online (Sandbox Code Playgroud)

3.x中的一个新功能是*在解包时使用运算符,表示任何额外的值.它在PEP 3132 - 扩展的可迭代解包中进行了描述.这也具有处理任何可迭代的优点,而不仅仅是序列.

它也可读.

如PEP中所述,如果您想在2.x下执行等效操作(无需创建临时列表),则必须执行以下操作:

it = iter(iterable)
head, tail = next(it), list(it)
Run Code Online (Sandbox Code Playgroud)

当然,如果您正在处理列表,没有3.x语法的最简单方法是:

head, tail = seq[0], seq[1:]
Run Code Online (Sandbox Code Playgroud)

  • 在执行 100 万次的 800 个元素的列表中,我有 2.8 秒的头部,*尾部 = seq 解决方案,而头部只有 1.8 秒,尾部 = seq[0],seq[1:] 解决方案。列表的切片仍然更快。 (2认同)
  • @CMCDragonkai 不,Python 的主要列表类是一个数组列表。这将是 O(n),因为它涉及将尾部复制到一个新列表(头部有一个 O(1) get)。 (2认同)

fra*_*xel 35

>>> 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]
Run Code Online (Sandbox Code Playgroud)


Nik*_*nyh 8

但是,对于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
Run Code Online (Sandbox Code Playgroud)

当您必须遍历列表的所有元素时,它很有用.例如,在合并排序中的天真合并2个分区.