在排序列表字典时解决问题

时间:2018-04-12 16:13:59

标签: python sorting numpy dictionary

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

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

我想添加一个新密钥'rank',它根据'a'包含排序字典的索引,如果是tie,则根据'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原生解决方案首选

2 个答案:

答案 0 :(得分:1)

使用numpy.lexsort

res = np.lexsort((to_sort['b'], to_sort['a']))

# array([1, 0, 2], dtype=int64)

请注意此功能的反向排序顺序,即上面的代码先按a排序,然后按b排序。

答案 1 :(得分:0)

我发现使用pandas相对容易

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