【问题标题】:How to pass list of tuple to lamda function如何将元组列表传递给 lambda 函数
【发布时间】:2019-01-14 09:46:12
【问题描述】:

当在 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 函数中的元组列表吗?

【问题讨论】:

    标签: python python-2.7 dictionary lambda


    【解决方案1】:

    内置 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 必须采用 这么多参数并应用于来自所有可迭代项的项目 并行。

    【讨论】:

    • 应该有更优雅的方式,map('{}={}'.format, t_dict, t_dict.values())是我能想到的最好的了
    • @Chris_Rands,是的,说得好。但是,我想就如何将多参数函数与map 一起使用的更一般性问题向 OP 提供建议。
    【解决方案2】:

    对于你的情况,你也可以使用%之后的元组进行格式化,所以:

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

    【讨论】:

      【解决方案3】:

      正如已经建议的那样,您可以将多个迭代传递给map,但如果您想单独传递items 而不是keysvalues,您可以使用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']
      

      【讨论】:

      • @Chris_Rands 是的,这比lambda 更好,但它仍然是一个需要两个参数的函数,因此这并没有真正改变核心问题。
      【解决方案4】:

      其他选项是这种方式(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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-18
        • 2014-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        相关资源
        最近更新 更多