【问题标题】:Sorting an array with respect to values of an other array one after the other一个接一个地根据另一个数组的值对数组进行排序
【发布时间】:2020-09-22 19:27:12
【问题描述】:

给定以下数组 (arr,indices),如果 ,我需要按照 升序 对数组进行排序,以 (i[0])th 索引>i[1] 等于 0 并且 降序 如果 i[1] 等于 1 ,其中 i 指的是索引数组的每个元素。

约束

1<= len(indices) <=10

1<= len(arr) <=10^4

示例

arr=[[1,2,3],[3,2,1],[4,2,1],[6,4,3]]

indices=[[2,0],[0,1]]

所需输出

[[4,2,1],[3,2,1],[6,4,3],[1,2,3]]

说明

第一个 arr 相对于第二个索引为 (indices[0][0]=2) 按升序排序为 (indices[0][1]=0)

[[3,2,1],[ 4,2,1],[1,2,3],[6,4,3]]

然后它以第 0 个索引为(indices[1][0]=0) 以降序排列为(indices[1][1]=1)

[[4,2,1],[3,2,1],[6,4,3],[1,2,3]]

注意

arr,索引需要作为输入,所以我不能写arr.sort(key=lambda x: (x[2],-x[0]))

我的方法

我尝试了以下方法,但没有给出正确的输出

arr.sort(key=lambda x:next(x[i[0]] if i[1]==0 else -x[i[0]] for i in indices))

我的输出

[[3,2,1],[4,2,1],[1,2,3],[6,4,3]]     

预期输出

 [[4,2,1],[3,2,1],[6,4,3],[1,2,3]]

【问题讨论】:

    标签: python sorting lambda expression


    【解决方案1】:

    这需要一把非常复杂的钥匙。在我看来,您在这里有许多不同的排序层,indices 的早期元素优先于后面的元素,此时排序顺序会受到影响。

    我认为排序键需要做的是返回一个元组/可迭代,其中要排序的第一个元素是 indices 的第一个元素所说的,以及要排序的第二个元素(如果第一个平局)是indices 的第二个元素所说的任何事情,依此类推。

    在这种情况下,您会想要这样的东西(键 lambda 中的嵌套理解,以生成该元组(或列表,在这种情况下)):

    arr=[[1,2,3],[3,2,1],[4,2,1],[6,4,3]]
    indices=[[2,0],[0,1]]
    
    out = sorted(arr, key=lambda a: [
            (-1 if d else 1) * a[i]
            for (i, d) in indices
        ])
    # [[4, 2, 1], [3, 2, 1], [6, 4, 3], [1, 2, 3]]
    

    仅对数字进行排序,您可以使用“乘以 -1 以降序而不是升序排序”的快速技巧。我在这里做的。

    【讨论】:

      【解决方案2】:

      你可以使用稳定性:

      from operator import itemgetter
      
      for i, r in reversed(indices):
          arr.sort(key=itemgetter(i), reverse=r)
      

      这不使用否定技巧,因此它也适用于数字以外的数据。

      【讨论】:

        【解决方案3】:

        看看这个:

        >>> a
        [[6, 4, 3], [4, 2, 1], [3, 2, 1], [1, 2, 3]]
        >>> i
        [[2, 0], [0, 1]]
        >>> for j in enumerate(i):                    
        ...     a.sort(key=lambda x:x[j[1][0]],reverse=False if j[1][1]==0 else True)
        ...     print(a)                                                          
        ...
        [[3, 2, 1], [4, 2, 1], [1, 2, 3], [6, 4, 3]]
        [[6, 4, 3], [4, 2, 1], [3, 2, 1], [1, 2, 3]]
        

        这是你想要的吗?

        我认为你的第二个例子是一个小错误。应该是

        [[6, 4, 3], [4, 2, 1], [3, 2, 1], [1, 2, 3]]
        

        而不是

        [[4,2,1],[3,2,1],[6,4,3],[1,2,3]]
        

        这是在下面

        然后它以第 0 个索引为 (indices[1][0]=0) 按降序排序为 (indices[1][1]=1)

        【讨论】:

          猜你喜欢
          • 2015-04-17
          • 2023-02-02
          • 2015-08-05
          • 1970-01-01
          • 2022-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-12
          相关资源
          最近更新 更多