Как передать список кортежей в функцию lamda - PullRequest
0 голосов
/ 14 января 2019

Когда список кортежей используется в цикле for, он отлично работает с двумя отдельными переменными, как показано ниже

t_dict = {
    "k1": "v1",
    "k2": "v2",
    "k3": "v3",
    "k4": "v4",
    "k5": "v5"
}

for k, v in t_dict.items():
    print "%s=%s" % (k, v)

Но при преобразовании в лямбду с помощью функции карты выдается ошибка, как показано ниже

print map(lambda k, v: "%s=%s" % (k, v), t_dict.items())

Traceback (most recent call last):   File "test.py", line 14, in <module>
    print map(lambda k, v: "%s=%s" % (k, v), t_dict.items()) TypeError: <lambda>() takes exactly 2 arguments (1 given)

Есть ли другой способ вызвать список кортежей в лямбда-функции?

Ответы [ 4 ]

0 голосов
/ 14 января 2019

Другой вариант - это (str.join(iterable)), чтобы получить список строк:

map( lambda t: "=".join(t), t_dict.items() )
#=> ['k3=v3', 'k2=v2', 'k1=v1', 'k5=v5', 'k4=v4']

Эта версия также может распечатать:

import sys
map( lambda t: sys.stdout.write("=".join(t) + "\n"), t_dict.items() )

# k3=v3
# k2=v2
# k1=v1
# k5=v5
# k4=v4
0 голосов
/ 14 января 2019

В вашем случае вы также можете использовать кортеж после % для форматирования, поэтому:

map(lambda t: "%s=%s" % t, t_dict.items())
0 голосов
/ 14 января 2019

Как уже предлагалось, вы можете передать несколько итераций в map, но если вы хотите передать items, а не keys и values по отдельности, вы можете использовать zip(*...) в "transpose " элементы в два списка и снова используйте *, чтобы передать их как два разных аргумента в map:

>>> list(map(lambda k, v: "%s=%s" % (k, v), *zip(*t_dict.items())))
['k1=v1', 'k2=v2', 'k3=v3', 'k4=v4', 'k5=v5']

Или используйте itertools.starmap:

>>> from itertools import starmap
>>> list(starmap(lambda k, v: "%s=%s" % (k, v), t_dict.items()))
['k1=v1', 'k2=v2', 'k3=v3', 'k4=v4', 'k5=v5']
0 голосов
/ 14 января 2019

Встроенный map поддерживает несколько итераций:

res = map(lambda k, v: "%s=%s" % (k, v), t_dict, t_dict.values())
# ['k1=v1', 'k2=v2', 'k3=v3', 'k4=v4', 'k5=v5']

Как описано в документации для map:

Если переданы дополнительные повторяемые аргументы, функция должна принять что много аргументов и применяется к элементам из всех итераций в параллельны друг другу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...