代码之家  ›  专栏  ›  技术社区  ›  J V

python lambda优化

  •  1
  • J V  · 技术社区  · 15 年前

    我刚学过lambda(关于时间),我想了一些事情,我有了一个大概的想法。

    我有一个map(),这里有一个lambda,可以缩短一些,但我不知道怎么做:

    map(lambda x: [ x.split()[0], x.split()[2], x.split()[4] ] , y)
    

    我希望可以一次获得拆分“x”的0、2和4元素,但目前我必须拆分3次才能得到它们…

    3 回复  |  直到 15 年前
        1
  •  6
  •   Ignacio Vazquez-Abrams    15 年前
    lambda x: operator.itemgetter(0, 2, 4)(x.split())
    
        2
  •  4
  •   Yuval Adam    15 年前

    map(lambda x: x.split()[0:5:2] , y)

    意义-采取 x.split() 拿着副列表 [0:5] 每一个第二个项目。

        3
  •  1
  •   martineau    15 年前

    只是为了多样化,没有 itemgetter() 呼叫:

        map(lambda x: [x[i] for i in (0,2,4)], (s.split() for s in y))
    

    这个 (0,2,4) 可替换为 range(0,5,2) 当然。
    对于如此少量的项目,您可以直接使用: [x[0], x[2], x[4]]

    工作原理: lambda 函数只返回所传递列表中所需元素的列表。这个 (s.split() for s in y) 是产生 split() 列表中项目的版本 y . 这一切都是为了 map() 适用于 兰姆达 对每个 拆分() 项目来自 Y . 在python 2.x中,它创建每个调用的结果列表。

    回答关于使用的评论中的后续问题 g = lambda x: [x[i] for i in (0,2,4)] 随着 (g(s.split()) for s in y) 摆脱 MAP() . 这基本上是正确的想法,但是第二个表达式只产生了一个生成器对象。这需要用类似的东西包装: [g(s.split()) for s in y] 得到结果。

    如果你不想分开 兰姆达 命名 g 您可以使用:

        [(lambda x: [x[i] for i in (0,2,4)])(s.split()) for s in y]