Python中的多重解包赋值:当您不知道序列长度时

17

多元解包赋值的教科书例子通常是这样的:

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个回答

37

Python 3.x 可以轻松实现此功能:

a, b, *c = someseq

Python 2.x需要做更多的工作:

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

1
这是哪个PEP添加的? - geckos
2
@geckos: PEP 3132:扩展可迭代解包。它从3.x系列发布的那一刻起就存在了,最早是在3.0版本中引入的。相关变更PEP 448:附加解包概括允许使用解包序列构造类型,例如{**d1, **d2}来创建一个新的dict字面量,相当于输入d1中的键/值对,然后是d2中的键/值对,或者使用['a', 'b', 'c', *range(10), 'd', 'e', 'f']0-9放在新的list中间,并用字母括起来。 - ShadowRanger
我终于解决了一个非常烦人的错误。谢谢! - kibromhft

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]

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

当然你可以这样做:

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

或者类似的解决方案。


1
有一个 Python 2 的解决方案(请参见其他答案)- 因此被踩了。 - Tony Suffolk 66
1
同意 - 但是当你说Python 2中没有类似的解决方案时,这会让人感到困惑 - 我认为在Python 2中有一个类似的解决方案,但语法不同且稍微不那么“自动化”。 - Tony Suffolk 66

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接