在列表推导中处理lambda表达式中的元组

时间:2018-11-08 18:12:50

标签: python lambda list-comprehension

我正在学习python,只是在意识到了lambda表达式和列表理解后:

>>> list(map(lambda x: x*x, [1,2]))

输出>>> 1,4

>>> list(map(lambda (x): x*x, [1,2])) 显示指向x

上括号的错误

看来,lambda表达式的参数列表周围不能带有括号。 (已在python 3.x中检查)

我现在想问,如果我不能在lambda表达式中的参数周围添加括号,那么我该如何使用映射和lambda表达式处理元组。例如:

>>> records = [('bob', 35, 'manager'), ('sue', 40, 'developer')]
>>> list(map((lambda (name, age, job): age), records))

此语句显示语法错误,指示name参数前的括号。然后,我尝试了不带括号的表达式:

>>> list(map((lambda name, age, job: age), records))

但是此语句还显示了一个错误,表明lambda表达式需要3个参数,但只提供了1个。

我知道map函数正在从records列表中提取整个记录元组,并将其传递给lambda函数,而lambda function正在将整个元组记录作为{的参数{1}}参数。

我想知道,如何处理lambda表达式中的元组。还请告诉我为什么在(Mark Lutz的《学习python》)一书中这样写是可行的?是否适用于python2.x。我是python的新手。提前致谢。

3 个答案:

答案 0 :(得分:5)

您只能在Python2中对lambda使用特殊的解包语法。但是,您可以使用itertools.starmap来完成records中每个项目的解包,因为它们已传递给Python3的幕后函数:

import itertools
records = [('bob', 35, 'manager'), ('sue', 40, 'developer')]
print(list(itertools.starmap(lambda name, age, job: age, records)))

输出:

[35, 40]

答案 1 :(得分:3)

您尝试使用的语法在Python 2.x中有效。在Python 3中无法使用。

在Python 3中,您可以使用位置索引:

from operator import itemgetter

records = [('bob', 35, 'manager'), ('sue', 40, 'developer')]

ages1 = list(map(lambda x: x[1], records))   # [35, 40]
ages2 = list(map(itemgetter(1), records))    # [35, 40]

更好(更高效,更易读)是完全放弃lambda。您可以在列表解压缩中使用列表解析:

ages3 = [age for _, age, _ in records]       # [35, 40]

如果您不介意zip,甚至可以使用tuple

_, ages4, _ = zip(*records)                  # (35, 40)

对于最后一个解决方案的较干净版本,可以使用itertools.islice

from itertools import islice

ages5 = next(islice(zip(*records), 1, 2))    # (35, 40)

答案 2 :(得分:0)

为什么不只是

val a: Seq[(Object, Object)] = myMap.keys.toList.zip(columnsMap.values.toList)
    logger.info("" + a.toString)

    val list = ListBuffer.empty[StructField]

    a.foreach { x => {
      list += StructField(x._1.toString, createStruct(x._2), false)
      //println(createStruct(x._2) + "--" + x.toString())
    }
      //   )
    }
    println("list is " + list)
    val schema = StructType(list.toList)
    println("-----" + schema.treeString)
    val df = sparkSession.sqlContext.createDataFrame(rdd, schema)
    df.printSchema()
    df.show