Python:按多个条件显示排序字典

Posted

技术标签:

【中文标题】Python:按多个条件显示排序字典【英文标题】:Python : Displaying a sorted dictionary by more than one condition 【发布时间】:2015-10-10 09:00:58 【问题描述】:

我想要我的代码做的是总结每个学生的主要成绩并返回他们的最终成绩,按成绩排序, 如果学生具有相同年级,首先显示高数学生。

我的代码:

nice=

try:

    with open('grades.txt') as file:
        data = file.readlines()

except IOError as ioerr:
    print(str(ioerr))


for each_line in data:
    (number, grade) = each_line.split()
    if number not in nice:
        nice[number]=0
    nice[number]+=int(grade)


for i in sorted(nice, key=lambda n: (-nice[n],n)):
    print(i,nice[i])

我的输入:文件:“grades.txt”

10885 10
70000 6
70000 10
60000 4
70000 4
60000 4
10885 10
60001 5
60002 8
60003 8

我的输出:

10885 20
70000 20
60000 8
60002 8
60003 8
60001 5

如您所见,我已经找到了一种方法,将每个部分成绩与最终成绩相加并按成绩显示,但我还没有弄清楚如何实现另一个条件,有效地得到这个 期望的输出

10885 20
70000 20
60003 8
60002 8
60000 8
60001 5

由于学生 60000,60002,60003 的成绩相同,因此应如上所示,为 60003>60002>60000。

【问题讨论】:

【参考方案1】:

尝试和思考它通常会有所帮助(即条件倒置)

sorted(nice.items(), key=lambda itm: map(int,itm[::-1]),reverse=True)

或在 python 3 中

sorted(nice.items(), key=lambda v: (int(v[1]),int(v[0])),reverse=True)

sorted(nice.items(), key=lambda itm: list(map(int,itm[::-1])),reverse=True)

应该适用于 python2 或 3

python3.4.3

>>> nice
'60000': '8', '60001': '5', '70000': '20', '60003': '8', '10885': '20', '60002': '8'
>>> sorted(nice.items(), key=lambda itm: list(map(int,itm[::-1])),reverse=True)
[('70000', '20'), ('10885', '20'), ('60003', '8'), ('60002', '8'), ('60000', '8'), ('60001', '5')]

【讨论】:

10885 20 60000 8 60003 8 60001 5 60002 8 70000 20 ,先生,我正在使用您的代码获得此输出。 (Python 3) KeyError: ('10885', 20) ,请注意我没有将学号转换为 int,因此如果我没记错的话它被认为是一个字符串 嗯,我想你一定是在这段代码之外做了什么

以上是关于Python:按多个条件显示排序字典的主要内容,如果未能解决你的问题,请参考以下文章

为多个条件实现按逻辑排序以对最终结果进行排序的问题

Excel VBA 在 Excel 2016 中按多个条件进行多行排序

在多个条件下排序列表[重复]

按多个条件对向量进行排序

python 将列表排序并将其排序为多个部分的函数,或基于数字的列表字典。

在 Grails 中使用条件对多个字段进行排序