如何使用Mathematica的Gather/Collect/Transpose函数进行转换:

{ { {1, foo1}, {2, foo2}, {3, foo3} }, { {1, bar1}, {2, bar2}, {3, bar3} } }


{ {1, foo1, bar1}, {2, foo2, bar2}, {3, foo3, bar3} }

编辑:谢谢!我希望有一种简单的方法,但是我想没有!

最佳答案

这是您的 list :

tst = {{{1, foo1}, {2, foo2}, {3, foo3}}, {{1, bar1}, {2, bar2}, {3,  bar3}}}

这是一种方法:
In[84]:=
Flatten/@Transpose[{#[[All,1,1]],#[[All,All,2]]}]&@
  GatherBy[Flatten[tst,1],First]

Out[84]= {{1,foo1,bar1},{2,foo2,bar2},{3,foo3,bar3}}

编辑

这是一个完全不同的版本,只是为了好玩:
In[106]:=
With[{flat = Flatten[tst,1]},
   With[{rules = Dispatch[Rule@@@flat]},
       Map[{#}~Join~ReplaceList[#,rules]&,DeleteDuplicates[flat[[All,1]]]]]]

Out[106]= {{1,foo1,bar1},{2,foo2,bar2},{3,foo3,bar3}}

编辑2

这是使用链表和内部函数累计结果的另一种方法:
In[113]:=
Module[{f},f[x_]:={x};
  Apply[(f[#1] = {f[#1],#2})&,tst,{2}];
  Flatten/@Most[DownValues[f]][[All,2]]]

Out[113]= {{1,foo1,bar1},{2,foo2,bar2},{3,foo3,bar3}}

编辑3

好的,对于那些认为以上所有内容都太复杂的人,这是一个非常简单的基于规则的解决方案:
In[149]:=
GatherBy[Flatten[tst, 1], First] /. els : {{n_, _} ..} :> {n}~Join~els[[All, 2]]

Out[149]= {{1, foo1, bar1}, {2, foo2, bar2}, {3, foo3, bar3}}

关于wolfram-mathematica - 正确使用Mathematica收集/收集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6974544/

10-13 06:39