在Mathematica中有许多函数不仅返回最终结果或单个匹配,而且返回所有结果。此类函数被命名为*List
. 展示:
- 折叠列表
- 嵌套列表
- 替换列表
- 组成列表
我缺少的是 MapList 函数。
例如,我想要:
MapList[f, {1, 2, 3, 4}]
{{f[1], 2, 3, 4}, {1, f[2], 3, 4}, {1, 2, f[3], 4}, {1, 2, 3, f[4 ]}}
我想要该函数的每个应用程序的列表元素:
MapList[
f,
{h[1, 2], {4, Sin[x]}},
{2}
] // Column
{h[f[1], 2], {4, Sin[x]}} {h[1, f[2]], {4, Sin[x]}} {h[1, 2], {f[4], Sin[x]}} {h[1, 2], {4, f[Sin[x]]}}
可以将其实现为:
MapList[f_, expr_, level_: 1] :=
MapAt[f, expr, #] & /@
Position[expr, _, level, Heads -> False]
但是,它的效率很低。考虑这个简单的案例,并比较这些时间:
a = Range@1000;
#^2 & /@ a // timeAvg
MapList[#^2 &, a] // timeAvg
ConstantArray[#^2 & /@ a, 1000] // timeAvg
0.00005088
0.01436
0.0003744
这说明平均而言MapList
,比将函数映射到列表中的每个元素并创建 1000x1000 数组的总和慢约 38 倍。