如何在Mathematica中组合满足特定条件的列表

时间:2014-01-10 15:41:42

标签: wolfram-mathematica data-manipulation

这可能是一个较低级别的问题,但我正在努力寻找一个正确的答案: 假设我有一个列表(或矩阵):

{
{{1},{1},{1},{2},{2},{2}},
{{3},{4},{5},{6},{7},{8}}
}

现在我想以这样的方式组合列,即将具有相同第一个元素的列组合在一起,即

{
{{1},{2}},
{{3,4,5},{6,7,8}}
}

有没有快速实现这一目标的方法?对不起任何可能的混淆! 谢谢!

2 个答案:

答案 0 :(得分:1)

这个怎么样:

a = {{{1}, {1}, {1}, {2}, {2}, {2}},
     {{3}, {4}, {5}, {6}, {7}, {8}}};

b = GatherBy[Transpose@a, First];
c = DeleteDuplicates@First@a;
d = Array[b[[#, All, 2, 1]] &, Length@c];
{c, d}
  

{{{1},{2}},{{3,4,5},{6,7,8}}}

答案 1 :(得分:1)

Chris Degnen已经提出了一个非常好的方法,但我想发表一些意见。它有助于使您的数据采用 Mathematica 函数最方便操作的格式,通常是行而不是列。这就是他回答Transpose的原因。

编辑:我想我误解了你的输出代表什么。我已相应地重写了我的答案。

使用GatherBy,正如克里斯所做的那样:

a = {{{1}, {1}, {1}, {2}, {2}, {2}}, {{3}, {4}, {5}, {6}, {7}, {8}}};

{#[[All, 1, 1]], #[[All, All, 2, 1]]} & @ GatherBy[a\[Transpose], First]
{{{1}, {2}}, {{3, 4, 5}, {6, 7, 8}}}

或使用SowReap:

Reap[MapThread[Sow[#2, #] &, a], _, {{#}, Join @@ #2} &][[2]]\[Transpose]
{{{1}, {2}}, {{3, 4, 5}, {6, 7, 8}}}

此处MapThread取代了最初的Transpose