【问题标题】:Sort a python dictionary by a specific function applied to its keys按应用于其键的特定函数对 python 字典进行排序
【发布时间】:2020-06-12 12:54:31
【问题描述】:

使用np.argsort 将基于 numpy 的函数应用于其键的排序字典。

以下可行,但似乎步骤太多;有没有更简单的方法?

假设我的最终排序函数将比此处显示的抽象 n/m 更复杂

import numpy as np

def get_sorted_dic(dictionary):

    keys = list(dictionary.keys())

    m, n = np.array(keys).T

    order = np.argsort(n/m).tolist()

    keyz = [keys[i] for i in order]

    return dict([(key, dictionary[key]) for key in keyz])

dic = {(7, 13): 'third', (9, 5): 'first', (27, 49): 'second'}

print(get_sorted_dic(dic))

返回正确排序的字典{(9, 5): 'first', (27, 49): 'second', (7, 13): 'third'}

【问题讨论】:

    标签: python python-3.x sorting dictionary


    【解决方案1】:

    你可以使用sorted函数:

    dic = {(7, 13): 'third', (9, 5): 'first', (27, 49): 'second'}
    
    dic_sorted = {k: dic[k] for k in sorted(dic.keys(), key=lambda t: t[1] / t[0])}
    print(dic_sorted)
    
    {(9, 5): 'first', (27, 49): 'second', (7, 13): 'third'}
    

    只需将lambda 函数替换为您的排序函数

    【讨论】:

    • 这个看起来更短,但实际上是不是步骤更少?
    • @uhoh 是的,与你所拥有的相比。这不涉及ndarrayslists 的中间步骤。
    • 我这样写的原因是使用 numpy 将一个数组除以另一个数组通常比以迭代方式一次除一对数字要快得多,但我现在看到我继续转换为列表,所以我可能会失去这个优势。
    • 好吧,这可能会更好,谢谢!
    【解决方案2】:

    你也可以直接对items()排序,然后申请dict()

    >>> dict(sorted(dic.items(), key=lambda x: x[0][1] / x[0][0]))
    {(9, 5): 'first', (27, 49): 'second', (7, 13): 'third'}
    

    【讨论】:

    • 谢谢!我有很多要学习的;我不知道这实际上是否最终会在幕后做一些与other answer 中所示的字典理解不同的事情,或者它是否最终会做几乎相同的事情。我会做一些测试,这对我来说是一次学习体验!
    猜你喜欢
    • 2016-03-03
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多