在Python中进行多个解包赋值时,序列长度未知怎么办

17 投票
2 回答
14572 浏览
提问于 2025-04-15 20:56

教科书上关于多个解包赋值的例子大概是这样的:

import numpy as NP
M = NP.arange(5)
a, b, c, d, e = M
# so of course, a = 0, b = 1, etc.

M = NP.arange(20).reshape(5, 4)     # numpy 5x4 array
a, b, c, d, e = M
# here, a = M[0,:], b = M[1,:], etc. (ie, a single row of M is assigned each to a through e)

(我想说的是,这个问题和numpy没有关系。其实,我更希望能有一个纯Python的解决方案。)

现在我在看的这段代码中,有两个复杂的地方:

  • 我通常不知道M的形状;

  • 我想解包一定数量的项目(肯定少于所有项目),并且我想把剩下的放到一个单一的容器里。

所以回到上面的5x4数组,我非常想做的是把M的前三行分别赋值给a、b和c(就像上面那样),然后把剩下的行(我不知道会有多少,只知道是个正整数)放到一个单一的容器中,all_the_rest = []

2 个回答

11

这个语法是在Python 3中新增的。

>>> # Python 3.x only
>>> a, b, *c = range(10)
>>> a
0
>>> b
1
>>> c
[2, 3, 4, 5, 6, 7, 8, 9]

但是在Python 2中没有类似的解决方案。

当然,你可以这样做:

>>> s = range(10)
>>> s
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> (a, b, c), rest = s[0:3], s[3:]
>>> a
0
>>> b
1
>>> c
2
>>> rest
[3, 4, 5, 6, 7, 8, 9]

或者其他类似的方法。

37

Python 3.x 可以很简单地做到这一点:

a, b, *c = someseq

而 Python 2.x 则需要多花点功夫:

(a, b), c = someseq[:2], someseq[2:]

撰写回答