对mathematica中其他部分的更改进行排序

时间:2011-03-09 06:12:40

标签: wolfram-mathematica list-manipulation

我只是想知道:

给定一个列表{{{3,1,2},{4,2,5}},{{7,1},{2,4}}},我想对第一个组件进行排序,然后让第二个组件像第一个组件一样进行更改。期望的结果是{{{1,2,3},{2,5,4}},{{1,7},{4,2}}}

我该怎么做?非常感谢你的帮助。

2 个答案:

答案 0 :(得分:10)

这是工作安全 - 确保一个班轮=)

In[16]:= list={{{3,1,2},{4,2,5}},{{7,1},{2,4}}};

In[17]:= {#[[Ordering[#]]],#2[[Ordering[#]]]}& @@@ list
Out[17]= {{{1,2,3},{2,5,4}},{{1,7},{4,2}}}

对于正在发生的事情,这可能会更加明确:

sorter[{a_, b_}] :=
 Module[{order = Ordering[a]},
  {a[[order]], b[[order]]}
  ]

In[19]:= sorter /@ list

Out[19]= {{{1, 2, 3}, {2, 5, 4}}, {{1, 7}, {4, 2}}}

答案 1 :(得分:4)

我建议:

#[[ All, Ordering@#[[1]] ]] & /@ list

这比迈克尔的短,效率几乎是其两倍。

micSort = {#[[Ordering[#]]], #2[[Ordering[#]]]} & @@@ # &;

wizSort = #[[All, Ordering@#[[1]]]] & /@ # &;

a = RandomInteger[100, {2400, 2, 15}];

micSort@a === wizSort@a
First@Timing@Do[#@a, {25}] & /@ {micSort, wizSort}

Out[1]= True

Out[2]= {0.453, 0.282}