如何将元组列表传递给lamda函数

时间:2019-01-14 09:46:13

标签: python python-2.7 dictionary lambda

在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)

但是当使用map函数转换为lambda时出现如下错误

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)

在lambda函数中还有其他方法可以调用元组列表吗?

4 个答案:

答案 0 :(得分:2)

内置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文档中所述:

  

如果传递了其他 iterable 参数,则 function 必须采用   那么多的参数,并应用于所有可迭代对象中的项   平行。

答案 1 :(得分:1)

对于您而言,您也可以在%之后使用元组进行格式化,因此:

map(lambda t: "%s=%s" % t, t_dict.items())

答案 2 :(得分:1)

正如已经建议的那样,您可以将多个可迭代对象传递给map,但是如果您想分别传递items而不是keysvalues,则可以使用{ {1}}至"transpose"到两个列表中,然后再次使用zip(*...)将它们作为两个不同的参数传递给*

map

或使用itertools.starmap

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

答案 3 :(得分:0)

通过其他方式(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