我只是想知道:
给定一个 list {{{3,1,2},{4,2,5}},{{7,1},{2,4}}}
,我想对第一个组件进行排序,然后让第二个组件像第一个组件一样更改。想要的结果是{{{1,2,3},{2,5,4}},{{1,7},{4,2}}}
。
我怎样才能做到这一点?非常感谢您的帮助。
我只是想知道:
给定一个 list {{{3,1,2},{4,2,5}},{{7,1},{2,4}}}
,我想对第一个组件进行排序,然后让第二个组件像第一个组件一样更改。想要的结果是{{{1,2,3},{2,5,4}},{{1,7},{4,2}}}
。
我怎样才能做到这一点?非常感谢您的帮助。
这是确保工作安全的单线=)
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}}}
我建议:
#[[ 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}