【问题标题】:Unpack into the list append method in Python解压到 Python 中的列表追加方法
【发布时间】:2020-01-10 17:43:26
【问题描述】:

解压元组时遇到问题。我希望将第一个值附加到列表中,并将第二个值分配给变量。例如:

list = []
tuple = (1, 2)

list.append, variable = tuple

但这引发了一个异常,因为我分配给一个 bultin 而不是实际调用。这在 Python 中可能吗?甚至更简单的操作,例如:

a, b = 5, 4
tuple = (1, 2)

a+, b = tuple

产生a = 6, b = 2

【问题讨论】:

  • 永远不要在内置变量之后命名变量,例如 list
  • 变量名不应使用保留关键字
  • @GaganTK 它们不是保留关键字(如andfor 等),您完全不能分配给它们
  • 您的两个示例彼此完全不同。感觉就像你可以使用清晰明显的 python 语法在几行上执行操作 - 这有什么问题?
  • 您不能分配给函数调用。我想我可以想象一个复杂的类,它可以让你编写Thing(lst).append, variable = tuple,其中Thing(lst) 将有一个名为append 的属性,它的setter 只调用lst.append。但我怀疑这是否真的值得付出努力和开销。只需写a, b = t; lst.append(a)

标签: python unpack iterable-unpacking


【解决方案1】:

没有允许这样做的简短语法。然而,这里有一个类创建了一个列表的包装器,因此分配给append 属性确实调用了底层列表的append 方法。如果您有 很多 个值要附加到列表中,这可能会很有用。

class Appender:
    def __init__(self, lst):
        self.lst = lst

    # The rare write-only property
    append = property(None, lambda self, v: self.lst.append(v))


values = []
value_appender = Appender(values)

value_appender.append, b = (1,2)
assert values == [1]

也许更简单,list 的子类,具有类似的属性:

class Appendable(list):
    take = property(None, lambda self, v: self.append(v))

values = Appendable()
values.take, b = (1, 2)
assert values == [1]

【讨论】:

  • 您好,非常酷的答案!这很简单,但我认为那行应该是values = Appendable()
  • 感谢您指出这一点;这是一个微不足道的错字,但它有很大的不同。
【解决方案2】:

append 是内置 list 类型的方法。为了方便起见,Python 允许在一行中将元组解包到变量中,但它不会决定使用元组的一部分作为参数来调用 append 方法。只需将您的代码写成多行,这也将有助于使其更易于阅读。

my_list = []
my_tuple = (1, 2)
a, b = my_tuple
my_list.append(a)

【讨论】:

    【解决方案3】:

    从技术上讲,你可以在一行中完成,但我不会。

    l = []
    a = (1,2)
    l[:0], b = [[x] if c == 0 else x for c,x in enumerate(a)]
    >>> l
    [1]
    >>> b
    2
    

    【讨论】:

    • 那是前置,而不是附加。
    • *l[len(l):], b = a 比这短一点(并附加),但实际使用仍然不是一个特别好的主意,因为它既难以辨认又慢。
    【解决方案4】:

    您可以在列表的 append 方法上使用 map 函数。

    >>> a = (6,7)
    >>> b = [1,2,3,4,5]
    >>> list(map(b.append, a))
    [None, None]
    >>> b
    [1, 2, 3, 4, 5, 6, 7]
    

    我不太确定 list() 在此语句中的作用,但它似乎有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-24
      • 2021-01-09
      • 2013-11-08
      • 2021-12-26
      • 1970-01-01
      • 2020-08-08
      • 2021-01-10
      • 2020-05-05
      相关资源
      最近更新 更多