如何用Python实现Mathematica风格的列表映射求和?求最简高效方案
列表映射求和的Python最简高效实现方式
问题背景
习惯使用Mathematica的简洁语法实现列表映射求和,例如对多项式函数求和的示例:
myList = {1,2,3}; output = Sum[ x^3+x^2+x , { x, myList } ]
本人在Python中写出了如下实现代码:
myList = [1,2,3] output = sum(list(map(lambda x: x*x*x+x*x+x , myList)))
想问这是否是Python中实现该功能的最简且高效的方式?个人认为这类简单任务不应嵌套三四个内置函数。
解答
你当前的实现并非Python里最简洁高效的方式,嵌套多个内置函数确实没必要,以下是几种更优的写法:
1. 生成器表达式(推荐:最简洁+最高效)
直接用生成器表达式替代map+list,生成器无需额外创建完整列表,内存效率更高,代码也更扁平直观:
myList = [1,2,3] output = sum(x**3 + x**2 + x for x in myList)
这里用x**3替代x*x*x,写法更接近Mathematica的x^3,可读性更强。生成器表达式是Python处理迭代求和的惯用方案,完全没有多余的嵌套。
2. 列表推导式(简洁但内存开销稍大)
如果一定要显式生成列表(通常没必要),列表推导式比map+lambda的写法更清晰:
myList = [1,2,3] output = sum([x**3 + x**2 + x for x in myList])
但相比生成器表达式,它会提前创建整个列表,处理大列表时内存占用更高,性能不如前者。
3. 简化版map写法(仍不如生成器直观)
如果坚持使用map,可以去掉多余的list转换(sum可以直接迭代map返回的迭代器),同时简化表达式:
myList = [1,2,3] output = sum(map(lambda x: x**3 + x**2 + x, myList))
但这种写法还是不如生成器表达式易读,不推荐作为首选。
总结:生成器表达式是实现该功能的最优选择,既简洁易懂,又能保证内存和执行效率,完全避免了多层内置函数嵌套的问题。
内容的提问来源于stack exchange,提问作者Kagaratsch
相关产品推荐
相关产品推荐

