Python:在 OrderedDict 中使用自定义比较器进行排序

标签 python

我有一本字典,内容如下:

dict = {'P1' :361 , 'P2' : 361, 'P3' : 391, 'P6' : 361, 'P4':361, 'P5' :361}

需要根据值降序排序。对于任何给定的项目,如果值与其比较的项目相同,则将按键的升序排序。因此,dict 的结果值应该是这样的。

{'P3' : 391 , 'P1' : 361, 'P2': 361, 'P4': 361, 'P5': 361,'P6' : 361}

我已经用这个实现了第一部分:

sorted_dict = OrderedDict(sorted(dict.items(), key=lambda t: t[1],reverse=True))

但是,我不确定如何超越它。我假设比较器函数通常是这样的

def comparator(item1,item2):
    if item1.value() == item2.value():
        if item1.key()<item2.key():
            return -1
        if item1.key()>item2.key():
            return 1
        if item1.key() == item2.key():
            return 0
    if item1.value() < item2.value():
        return -1
    if item1.value() > item2.value():
        return 1

我不确定如何实现它。请原谅我的天真,我是 Python 的初学者,对该语言的编程结构知之甚少。

最佳答案

您可以使用稍微不同的 lambda 表达式作为排序键。

sorted_dict = OrderedDict(sorted(dict.items(), key=lambda x: (-x[1], x[0])))

输出:

OrderedDict([('P3', 391), ('P1', 361), ('P2', 361), ('P4', 361), ('P5', 361), ('P6', 361)])

提供一个 key 就是提供一个在比较之前转换每个项目的函数。所以在这里,匿名 lambda 函数提供了一个用于排序的序列转换——序列通过依次比较每个元素来排序。因此,我们按数字的负数排序(反转自然升序 -> 降序),如果比较相等,我们继续对字符串进行排序,它通常按您希望的方式排序(至少提供的 sample )。您可能需要使用 string natural sorting对于字符串中较大的数字,如果字典排序不会给您预期的结果。

关于Python:在 OrderedDict 中使用自定义比较器进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38032827/

相关文章:

Python:计算当前时间和上次登录之间的时间。 (自动通讯)

python - Windows 上与 Python 共享内存中的信号量?

python - 我应该在 while 循环内还是外部提交我的数据库?

python - 在 Jinja2 中执行算术运算

如果子列表中存在给定元素,Python 将返回子列表的元素

python - 如何转义 SQLite FTS3 查询中的 - 字符?

python - 如何将行替换为具有相同索引的同一数据帧中的其他行?

python - 嵌套包导入在从包目录内调用时有效,但在其他地方则无效

python - 有效地将函数应用于numpy数组中的球形邻域

python - 那些 python* 可执行文件是怎么回事?