【问题标题】:Multiple Unpacking Assignment in Python when you don't know the sequence length当您不知道序列长度时,Python中的多重解包分配
【发布时间】:2011-02-01 16:07:45
【问题描述】:

教科书上多次拆包赋值的例子是这样的:

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的形状;和

  • 我要拆包一定数量的 物品(绝对少于所有物品),以及 我想把剩下的放在一个single中 容器

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

【问题讨论】:

    标签: python variable-assignment


    【解决方案1】:

    Python 3.x 可以轻松做到这一点:

    a, b, *c = someseq
    

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

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

    【讨论】:

    • 添加这个的 PEP 是什么?
    • @geckos:PEP 3132: Extended Iterable Unpacking。从 3.x 线出现的那一刻起,它就一直存在,从 3.0 开始。一个相关的更改PEP 448: Additional Unpacking Generalizations 允许使用解包序列的 constructing 类型,例如{**d1, **d2} 生成一个新的 dict 文字,相当于从 d1 键入键/值对,然后键入来自 d2 的对,或 ['a', 'b', 'c', *range(10), 'd', 'e', 'f']0-9 放在中间新的list 以字母结尾。
    【解决方案2】:

    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]
    

    或其他类似的解决方案。

    【讨论】:

    • 有一个 python 2 解决方案(请参阅另一个答案) - 因此投反对票。
    • 同意——但当你说 Python 2 中没有类似的解决方案时会让人感到困惑——我建议 Python 2 中有类似的解决方案,但语法不同,而且稍微少一些“自动”。
    猜你喜欢
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 2012-10-08
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    相关资源
    最近更新 更多