Python : 显示按多个条件排序的字典
Python : Displaying a sorted dictionary by more than one condition
我想让我的代码做的是对每个学生的部分成绩和 return 他们的最终成绩求和,按成绩排序, 和 如果同年级的学生,先显示高分学生。
我的代码:
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.
尝试把它想成只是略有不同(即条件倒置)通常会有所帮助
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')]
我想让我的代码做的是对每个学生的部分成绩和 return 他们的最终成绩求和,按成绩排序, 和 如果同年级的学生,先显示高分学生。
我的代码:
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.
尝试把它想成只是略有不同(即条件倒置)通常会有所帮助
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')]