Распаковка нескольких списков и словарей в качестве аргументов функции в python 2

Возможные релевантные вопросы (я искал тот же вопрос, но не нашел)


Python предоставляет удобный способ распаковывать аргументы в функции с помощью звездочки, как описано в https://docs.python.org/3/tutorial/controlflow.html#unpacking-argument-lists.

>>> list(range(3, 6))            # normal call with separate arguments
[3, 4, 5]
>>> args = [3, 6]
>>> list(range(*args))            # call with arguments unpacked from a list
[3, 4, 5]

В моем коде я вызываю такую ​​функцию:

def func(*args):
    for arg in args:
        print(arg)

В Python 3 я называю это так:

a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9]

func(*a, *b, *c)

Какие выходы

1 2 3 4 5 6 7 8 9

Однако в Python 2 я сталкиваюсь с исключением:

>>> func(*a, *b, *c)
  File "<stdin>", line 1
    func(*a, *b, *c)
             ^
SyntaxError: invalid syntax
>>> 

Кажется, что Python 2 не может распаковывать несколько списков. Есть ли лучший и более чистый способ сделать это, чем

func(a[0], a[1], a[2], b[0], b[1], b[2], ...)

Моя первая мысль заключалась в том, что я могу объединить списки в один список и распаковать его, но мне было интересно, есть ли лучшее решение (или что-то, чего я не понимаю).

d = a + b + c
func(*d)

На самом деле вам не нужен d для хранения объединенного списка; вы можете записать f(*a+b+c) напрямую. Единственным недостатком этого подхода, который я вижу, является то, что он не работает с произвольными итерациями, все они должны быть фактическими списками (или всеми кортежами). f(*itertools.chain(a, b, c)) может исправить это при необходимости.

jasonharper 26.10.2018 05:58

Если вы не поддерживаете древнюю библиотеку Python, вам следует просто использовать Python 3.

Purple Ice 26.10.2018 11:57

Короче говоря, программа должна быть совместима как с Python 2, так и с Python 3.

NoNo EsImposible 26.10.2018 16:46

Мне нужно сделать это и в python 2 сегодня. Я собираюсь создать награду.

Rick supports Monica 09.10.2020 19:24

python2 больше не поддерживается и НЕ ДОЛЖЕН ИСПОЛЬЗОВАТЬСЯ

KetZoomer 09.10.2020 19:31

@KetZoomer, я понимаю. У меня более 30 тысяч человек, отвечающих на вопросы о python 3 за последние 6 лет, и я говорю вам, что в этом случае для меня невозможно не использовать его. Очень жаль.

Rick supports Monica 09.10.2020 19:58

Вам все еще нужен ответ, или данный ответ решает вашу задачу?

Abhinav Mathur 13.10.2020 07:40

Мне было достаточно ответа Джейсона, но, конечно, сейчас я больше не работаю над проектом, так как Python 2 официально не поддерживается.

NoNo EsImposible 15.10.2020 00:49
5
8
848
1

Ответы 1

Рекомендация: перейти на Python 3
С 1 января 2020 г. ветвь 2.x языка программирования Python больше не поддерживается Python Software Foundation.

Распаковка списков и переход на *args

Решение Python 3

def func(*args):
    for arg in args:
        print(arg)

a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9]

func(*a, *b, *c)

Решение Python 2

Если требуется Python 2, itertools.chain предоставит обходной путь:

import itertools


def func(*args):
    for arg in args:
        print(arg)

a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9]

func(*itertools.chain(a, b, c))

Выход

1
2
3
4
5
6
7
8
9

Распаковка словарей и переход на **kwargs

Решение Python 3

def func(**args):
    for k, v in args.items():
        print(f"key: {k}, value: {v}")


a = {"1": "one", "2": "two", "3": "three"}
b = {"4": "four", "5": "five", "6": "six"}
c = {"7": "seven", "8": "eight", "9": "nine"}

func(**a, **b, **c)

Решение Python 2

Как упоминалось в комментариях Эллиот, если вам нужно распаковать несколько словарей и перейти к kwargs, вы можете использовать следующее:

import itertools

def func(**args):
    for k, v in args.items():
        print("key: {0}, value: {1}".format(k, v))


a = {"1": "one", "2": "two", "3": "three"}
b = {"4": "four", "5": "five", "6": "six"}
c = {"7": "seven", "8": "eight", "9": "nine"}

func(**dict(itertools.chain(a.items(), b.items(), c.items())))

Идеально. Можете ли вы случайно предоставить эквивалент Python 2 для распаковки словаря?

Rick supports Monica 09.10.2020 20:00
func(**dict(itertools.chain(a.items(), b.items(), c.items()))) (если a, b и c - dicts)
Elliot 09.10.2020 20:17

Другие вопросы по теме