添加列表的最后两个元素

时间:2011-04-12 06:23:26

标签: wolfram-mathematica

在Mathematica中,获取清单的最简洁方法是什么

{r1, r2, r3, ..., rn, a, b}

并返回

{r1, r2, r3, ..., rn, a + b}

或更一般地

{r1, r2, r3, ..., rn, f[a, b]}

某些功能f

5 个答案:

答案 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}