在Mathematica中,获取清单的最简洁方法是什么
{r1, r2, r3, ..., rn, a, b}
并返回
{r1, r2, r3, ..., rn, a + b}
或更一般地
{r1, r2, r3, ..., rn, f[a, b]}
某些功能f
?
答案 0 :(得分:3)
如果性能不是一个大问题(列表没有打包等),我会使用规则:
lst = {a, b, c, d, e}
In[13]:= Replace[lst, {left__, ntl_, l_} :> {left, f[ntl, l]}, {0}]
Out[13]= {a, b, c, f[d, e]}
答案 1 :(得分:3)
lst = {a[1], a[2], a[3], a[4], a[5], a[6], a[7], a, b};
lst /. {a___, b_, c_} -> {a, f[b, c]}
==> {a[1], a[2], a[3], a[4], a[5], a[6], a[7], f[a, b]}
或(丑陋):
Append[Take[lst, {1, -3}], f @@ lst[[{-2, -1}]]]
答案 2 :(得分:1)
如果我没有第二次猜到西蒙,我会先回答。坚果。无论如何,这是我迟到的回复。
combineLast =
Module[{x = #},
x[[-2]] = #2 @@ x[[-2 ;;]];
Most[x]
] &;
比较:
leoCL[lst_, f_] := Replace[lst, {left__, ntl_, l_} :> {left, f[ntl, l]}, {0}]
a = RandomInteger[1*^9, 5000];
Do[combineLast[a, Plus], {5000}] // Timing
Do[leoCL[a, Plus], {5000}] // Timing
{0.078, Null} {1.844, Null}
答案 3 :(得分:1)
假设'list'已定义:
Remove[list];
list = {r1, r2, r2, r4, r5, a, b};
将'list'重新设置为{r1,r2,r3,r4,r5,a},[[-1]]替换为'list'中最后两个元素的总和。
list = ReplacePart[Drop[list, -1], -1 -> Plus @@ list[[-2 ;; -1]]]
感谢您提出这个问题,顺便说一下。 :)
答案 4 :(得分:1)
以下是我的看法:
addLastTwo = Function[Append[Drop[#, -2], Total[Take[#, -2]]]];
In[225]:= addLastTwo[{r1, r2, r3, r4, r5}]
Out[225]= {r1, r2, r3, r4 + r5}
这比Mr.Wizard的解决方案略快,尽管不那么通用:
In[226]:= Do[addLastTwo@a, {10000}] // Timing
Out[226]= {0.25, Null}
In[227]:= Do[combineLast[a, Plus], {10000}] // Timing
Out[227]= {0.39, Null}