当您不知道序列长度时,在Python中进行多次解包分配

时间:2010-03-28 03:17:54

标签: python variable-assignment

多个解包分配的教科书示例如下:

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 个答案:

答案 0 :(得分:27)

Python 3.x可以轻松完成此任务:

a, b, *c = someseq

Python 2.x需要更多工作:

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

答案 1 :(得分: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]

或其他类似的解决方案。