【问题标题】:Unpack list into middle of a tuple将列表解压缩到元组的中间
【发布时间】:2015-08-24 15:20:10
【问题描述】:

我有一个大小不定的列表:

l = [...]

我想将此列表解压缩为具有其他值的元组,但以下失败:

t = ("AA", "B", *l, "C")

我如何形成以下内容?

t = ("AA", "B", l[0], ..., l[:-1], "C")

编辑:只做一个切片 [a:b] 也很好:

t = ("AA", "B", l[a], ..., l[b], "C")

【问题讨论】:

    标签: python list python-3.x tuples


    【解决方案1】:

    您不能通过替换这样的值来解包到元组中(但是 - 请参阅PEP 448),因为解包只会发生在左侧表达式或错误消息中,赋值目标 .

    另外,赋值目标应该有有效的 Python 变量。在您的情况下,元组中也有字符串文字。

    但是你可以通过连接三个元组来构造你想要的元组,就像这样

    >>> l = [1, 2, 3, 4]
    >>> ("A", "B") + tuple(l[:-1]) + ("C",)
    ('A', 'B', 1, 2, 3, 'C')
    >>> ("A", "B") + tuple(l) + ("C",)
    ('A', 'B', 1, 2, 3, 4, 'C')
    

    【讨论】:

    • 这按预期工作,谢谢,尽管我认为 * 符号应该作为糖支持,因为这很难看。我想我可以写一个函数来做到这一点。
    【解决方案2】:

    从 python 3.5 开始,您现在可以使用您的第一种方法:

    >>> l = [1, 2, 3]
    >>> t = ("AA", "B", *l, "C")
    >>> t
    ('AA', 'B', 1, 2, 3, 'C')
    

    您可以按照您的预期使用切片:

    >>> ("AA", "B", *l[:-1], "C")
    ('AA', 'B', 1, 2, 'C')
    

    相关PEP,供参考:PEP448

    【讨论】:

      【解决方案3】:

      你可以flatten the list然后转换成元组。

      >>> import itertools
      >>> l=[1,2,3,4]
      >>> t = ('A', 'B', l, 'C')
      >>> t
      ('A', 'B', [1, 2, 3, 4], 'C')
      >>> tuple(itertools.chain.from_iterable(t))
      ('A', 'B', 1, 2, 3, 4, 'C')
      >>>
      

      【讨论】:

      • 当列表包含多个字符项(如“abc”)时,这不起作用。
      • 对。这是正确的行为。列表和字符串都是可迭代的。因此,字符串也被扩展,类似于列表。我的错。
      猜你喜欢
      • 2014-08-26
      • 1970-01-01
      • 2014-07-13
      • 2012-10-10
      • 2011-11-25
      • 2022-01-19
      • 2020-12-14
      • 2015-08-24
      相关资源
      最近更新 更多