解压缩到 Python 中的列表追加方法中



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

list = []
tuple = (1, 2)
list.append, variable = tuple

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

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

屈服于a = 6, b = 2.

没有简短的语法来允许这样做。但是,下面是一个在列表周围创建包装器的类,因此分配给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]

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

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

可以在列表的追加方法上使用映射函数。

>>> 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(( 在此语句中的作用,但它似乎有效。

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

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

最新更新