2

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

我该怎么做?

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

4

3 回答 3

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)。除非您确实想保留原始列表,否则您应该更喜欢同步排序。

于 2013-08-27T23:06:21.067 回答
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
于 2013-08-27T23:07:00.400 回答
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,我很确定就地排序会减少内存密集型并且速度大致相同。

编辑:根据这个答案,我肯定会推荐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]]
于 2013-08-27T23:14:02.563 回答