Python:按多个条件

时间:2015-07-21 03:51:59

标签: python sorting dictionary multiple-conditions

我希望我的代码要做的是总结每个学生的学业成绩并返回他们的最终成绩,按年级排序, 如果对于相同的学生等级 ,首先显示高数学生。

我的代码:

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 个答案:

答案 0 :(得分: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')]