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

dou*_*oug 13 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)
Run Code Online (Sandbox Code Playgroud)

(我的问题不numpy具体.事实上,我更喜欢纯Python解决方案.)

对于我现在正在看的那段代码,我看到了这个直接场景的两个复杂问题:

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

  • 我想解压一定数量的物品(绝对比所有项目更少),我想把其余为单一 容器

回到上面的5x4数组,我非常想做的是分别将前三行M分配给a,b和c(完全如上),其余行(我不知道如何)很多东西,只有一些正整数)到一个容器,all_the_rest = [].

Ign*_*ams 29

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

a, b, *c = someseq
Run Code Online (Sandbox Code Playgroud)

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

(a, b), c = someseq[:2], someseq[2:]
Run Code Online (Sandbox Code Playgroud)

  • @geckos:[PEP 3132:扩展的可重复拆包](https://www.python.org/dev/peps/pep-3132/)。从3.x版本问世起就存在,从3.0开始。一项相关的更改[PEP 448:其他拆包概述](https://www.python.org/dev/peps/pep-0448/)允许使用拆包序列来*构造*类型,例如`{** d1,** d2}来创建新的dict字面量,等同于键入d1中的键/值对,然后键入d2中的对,或者是[['a','b','c',* range( 10),“ d”,“ e”,“ f”]`,用于将“ 0”-“ 9”放在字母所预定的新“列表”中间。 (2认同)

Mik*_*ham 11

Python的语法添加到Python 3中

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

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

或其他类似的解决方案

  • 来自其他帖子的Python 2解决方案与我的解决方案相同...... (2认同)