4

私はちょうど不思議です:

list が与えられた{{{3,1,2},{4,2,5}},{{7,1},{2,4}}}場合、最初のコンポーネントを並べ替えてから、最初のコンポーネントと同じように 2 番目のコンポーネントを変更します。望ましい結果は{{{1,2,3},{2,5,4}},{{1,7},{4,2}}}です。

これどうやってするの?助けてくれて本当にありがとうございます。

4

2 に答える 2

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}}}
于 2011-03-09T06:17:56.780 に答える
4

私は提案します:

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

これは、Michael のものよりも短く、ほぼ 2 倍効率的です。

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}
于 2011-03-09T16:16:36.620 に答える