如何使用Mathematica按每个列表的元素总和对N个列表进行排序?

时间:2012-01-17 05:51:38

标签: list wolfram-mathematica sorting mathematica-8

给定包含k子列表的列表,让 A={{a1,a2,a3,...},{b1,b2,b3,...},...},我想按照Total[A[i]]对这些子列表进行排序。有没有有效的方法来做到这一点?

3 个答案:

答案 0 :(得分:8)

检查文档中的SortBy,了解对列表列表进行排序的各种可能性。

 SortBy[A,Total]

给出你需要的东西。

编辑:根据巫师先生的评论以及其中的链接中的解释,

SortBy[A,{Total}]

更好。

答案 1 :(得分:4)

请注意,在许多情况下,基于Ordering的排序可能比SortBy更快,因为它允许我们利用矢量化。在这种特殊情况下,加速并不是那么大:

In[50]:= test = RandomInteger[10,{5000000,5}];

In[54]:= (res1=SortBy[test,{Total}]);//Timing
(res2 = test[[Ordering[Total[test,{2}]]]]);//Timing
res1===res2

Out[54]= {1.422,Null}
Out[55]= {1.125,Null}
Out[56]= True

但是,这是因为Total是一个内置函数。引入SortBy的全部原因是效率(即,对于单个比较函数。对于几个比较函数作为连接断路器,也是方便)。 Sort更有效,因为它更具体,因此在主要评估序列中绕过更多步骤。但是,SortBy无法利用排序所基于的函数的可能的可列表性(向量化性质) - 它逐个应用于列表元素。具有排序的解决方案明确地利用了排序函数的整体销售计算的可能性(在这种情况下,Total[#,{2}]&执行此操作),因此更快。

例如,如果任务是根据每个子列表中的第二,第三和第四个元素的总和进行排序,我们会看到更大的性能差异:

In[60]:= (res3=SortBy[test,{Total[#[[2;;4]]]&}]);//Timing
(res4=test[[Ordering[Total[test[[All,2;;4]],{2}]]]]);//Timing
res3==res4

Out[60]= {2.39,Null}
Out[61]= {1.11,Null}
Out[62]= True

通常,性能提升对于计算密集和向量化的排序函数来说是最大的,并且当应用于整个列表时它们更快。但请注意,对于大型列表,排序的性能提升永远不会像排序功能本身那么大。这是因为排序的内在复杂性,对于长度为n*Log[n]的大型列表,它与n成正比,而且这种复杂性始终存在。

答案 2 :(得分:0)

以下内容应该有效(但我现在无法测试):

Sort[A, Total[#1]<Total[#2]&]