我对编程比较陌生,我想用每个子数组中所有项的值对二维数组(在Python中调用它们的列表)进行排序。例如:
pop = [[1,5,3],[1,1,1],[7,5,8],[2,5,4]]
pop的第一个元素之和为9,因为1 + 5 + 3 = 9.第二个元素的总和为3,因为1 + 1 + 1 = 3,依此类推。
我想重新安排这个,所以新订单将是:
newPop = [pop[1], pop[0], pop[3], pop[2]]
我该怎么做?
注意:我不想对每个子数组中的元素进行排序,而是根据每个子数组中所有数字的总和进行排序。
答案 0 :(得分:4)
您可以使用sorted()
:
>>> pop = [[1,5,3],[1,1,1],[7,5,8],[2,5,4]]
>>> newPop = sorted(pop, key=sum)
>>> newPop
[[1, 1, 1], [1, 5, 3], [2, 5, 4], [7, 5, 8]]
您还可以使用pop.sort(key=sum)
就地排序。除非你肯定想要保留原始列表,否则你应该更喜欢按节目排序。
答案 1 :(得分:2)
试试这个:
sorted(pop, key=sum)
说明:
sorted()
过程按升序对可迭代(在本例中为列表)进行排序key
参数以确定列表中元素的哪些属性将用于排序sum
基本上这就是发生的事情:
[[1,5,3], [1,1,1], [7,5,8], [2,5,4]] # original list
[sum([1,5,3]), sum([1,1,1]), sum([7,5,8]), sum([2,5,4])] # key=sum
[9, 3, 20, 11] # apply key
sorted([9, 3, 20, 11]) # sort
[3, 9, 11, 20] # sorted
[[1,1,1], [1,5,3], [2,5,4], [7,5,8]] # elements coresponding to keys
答案 2 :(得分:1)
>>> pop = [[1,5,3],[1,1,1],[7,5,8],[2,5,4]]
>>> pop.sort(key=sum)
>>> pop
[[1, 1, 1], [1, 5, 3], [2, 5, 4], [7, 5, 8]]
我必须查找Python的排序算法 - 我认为它叫做Timsort,我非常确定就地排序会减少内存密集度和速度相同。
修改:根据this回答,我肯定会推荐x.sort()
如果你想以一种不太传统的方式对列表进行排序,你可以编写自己的函数(需要一个参数。)冒着开始火焰战争的风险,我会反对lambda
提出建议。
例如,如果您希望第一个数字的加权比第二个数字更重,那么比第三个数字更重要,等等:
>>> def weightedSum(listToSum):
... ws = 0
... weight = len(listToSum)
... for i in listToSum:
... ws += i * weight
... weight -= 1
... return ws
...
>>> weightedSum([1, 2, 3])
10
>>> 1 * 3 + 2 * 2 + 3 * 1
10
>>> pop
[[1, 5, 3], [1, 1, 1], [7, 5, 8], [2, 5, 4]]
>>> pop.sort(key=weightedSum)
>>> pop
[[1, 1, 1], [1, 5, 3], [2, 5, 4], [7, 5, 8]]
>>> pop += [[1, 3, 8]]
>>> pop.sort(key=weightedSum)
>>> pop
[[1, 1, 1], [1, 5, 3], [1, 3, 8], [2, 5, 4], [7, 5, 8]]