【问题标题】:sort 2-D list python排序二维列表python
【发布时间】:2013-08-30 21:01:21
【问题描述】:

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

我该怎么做?

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

【问题讨论】:

    标签: python sorting arrays


    【解决方案1】:

    你可以使用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)
    • @inspectorG4dget 当然,我也为此添加了一种方法。
    【解决方案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
    

    【讨论】:

    • 推荐就地排序,除非你绝对需要一个新列表(无论如何+1)
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-09-04
      • 2015-10-16
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 2021-07-03
      相关资源
      最近更新 更多