想象一下你有:
a = {{5, 1, 1}, {2, 0, 7}, {3, -4, 6}}
并且您想要通过第二列订购,以获得
b = {{3, -4, 6}, {2, 0, 7}, {5, 1, 1}}
我尝试使用SortBy[a, Last]
并在最后一栏工作,但我无法让它适用于第二列。
提前致谢: - )
答案 0 :(得分:19)
这确实有效:
SortBy[a,#[[2]]&]
答案 1 :(得分:12)
可替换地,
a[[Ordering[a[[All, 2]]]]]
答案 2 :(得分:8)
在这里,对于强制性时间(我在方法中添加了基本的Sort
):
a = RandomReal[{0, 10}, {1000000, 3}];
Sort[a, #2[[2]] < #1[[2]] &]; // Timing
(* ==> {34.367, Null} *)
SortBy[a, #[[2]] &]; // Timing
(* ==> {0.436, Null} *)
a[[Ordering[a[[All, 2]]]]]; // Timing
(* ==> {0.234, Null}, Chris wins *)
答案 3 :(得分:5)
也许您可以使用此网址:http://12000.org/my_notes/mma_matlab_control/KERNEL/node99.htm
您可以使用的代码:
a={{300,48,2},{500,23,5},{120,55,7},{40,32,1}};
b=SortBy[a, #[[2]]&]
结果:
Out[9]= {{500,23,5},{40,32,1},{300,48,2},{120,55,7}}
答案 4 :(得分:4)
如果您的数据是:
a = {{5, 1, 1}, {2, 1, 7}, {3, -4, 6}}
你需要对第二个元素进行稳定的排序,产生:
{{3, -4, 6}, {5, 1, 1}, {2, 1, 7}}
尝试使用SortBy
来解决此问题可能会非常令人沮丧,除非您意识到这一点:
SortBy[a, {#[[2]] &}]
{}
括号很重要。
答案 5 :(得分:2)
在这方面只是一个提示:
当使用像Sqrt[...]
这样的非atomar对象时,您可能会得到意想不到的结果:
SortBy[Range[10], -Sqrt[#] &]
{9, 4, 1, 8, 2, 3, 5, 6, 7, 10}
这是由于
排序通常先将较短的表达式排序,然后排序 然后以深度优先的方式比较部件。 (Mathematica参考手册)。
当需要数字排序时,始终使用N.