我正在学习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的新手。提前致谢。
答案 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