排序二维列表python

时间:2013-08-27 23:04:52

标签: python sorting arrays

我对编程比较陌生,我想用每个子数组中所有项的值对二维数组(在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]]

我该怎么做?

注意:我不想对每个子数组中的元素进行排序,而是根据每个子数组中所有数字的总和进行排序。

3 个答案:

答案 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)

@arshajii击败了我,他的答案很好。但是,如果您更喜欢就地排序:

>>> 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]]