Распакуйте в список метод добавления в Python - PullRequest
1 голос
/ 10 января 2020

Я сталкиваюсь с проблемой при распаковке кортежа. Я хочу, чтобы первое значение было добавлено в список, а второе - для переменной. Например:

list = []
tuple = (1, 2)

list.append, variable = tuple

Но возникает исключение, так как я назначаю bultin и фактически не звоню. Возможно ли это в Python? Или даже более простая операция, такая как:

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

a+, b = tuple

для получения a = 6, b = 2.

Ответы [ 3 ]

3 голосов
/ 10 января 2020

Нет краткого синтаксиса, позволяющего это сделать. Однако вот класс, который создает оболочку вокруг списка, так что присвоение атрибуту 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]
2 голосов
/ 10 января 2020

append - это метод встроенного типа list. Python позволяет для удобства распаковывать кортежи в переменные в одну строку, но он не решит вызывать метод append с частью вашего кортежа в качестве аргумента. Просто напишите свой код в несколько строк, это также облегчит чтение.

my_list = []
my_tuple = (1, 2)
a, b = my_tuple
my_list.append(a)
0 голосов
/ 10 января 2020

Технически, да, вы могли бы сделать это в одну строку, но я бы не стал.

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