【问题标题】:solving a tie when sorting a dictionary of lists排序列表字典时解决平局
【发布时间】:2018-04-12 16:13:59
【问题描述】:

我有一个包含列表的字典,每个列表的元素数量相同。

to_sort={'a':np.array([1,1,3]),'b':np.array([5,4,5])}

我想添加一个新键“rank”,它包含根据“a”排序的字典的索引,如果出现平局,则根据“b”。 我能做到:

to_sort['a'].argsort() 

并获取排序索引。但是,如果出现示例中的平局,我会得到:

np.array([1,3,3]).argsort()
Out[17]: array([0, 1, 2], dtype=int64)

现在我想使用“b”的值对这些排序索引进行排名。 例如所需的输出 -> [1,0,2] 而不是 [0,1,2]。 首选 Python 原生解决方案

【问题讨论】:

    标签: python sorting numpy dictionary


    【解决方案1】:

    为此使用numpy.lexsort

    res = np.lexsort((to_sort['b'], to_sort['a']))
    
    # array([1, 0, 2], dtype=int64)
    

    注意这个函数的排序顺序相反,即上面的代码首先按a排序,然后按b

    【讨论】:

      【解决方案2】:

      我发现使用 pandas 也相对容易

      custom_ranked=pd.DataFrame(to_sort).sort_values(['a','b'],
          ascending=[False,True]).loc[:,['a','b']]
      

      【讨论】:

        猜你喜欢
        • 2021-04-02
        • 1970-01-01
        • 2011-09-23
        • 1970-01-01
        • 1970-01-01
        • 2020-07-21
        • 2019-06-15
        • 2012-11-26
        相关资源
        最近更新 更多