首页 > 试题广场 >

成绩排序

[编程题]成绩排序
  • 热度指数:193277 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

查找和排序

题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。

示例:
jack      70
peter     96
Tom       70
smith     67

从高到低  成绩
peter     96
jack      70
Tom       70
smith     67

从低到高

smith     67

jack      70
Tom      70
peter     96


输入描述:
注意一个case里面有多组样例,请用循环处理输入
输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开。


输出描述:
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开
示例1

输入

3
0
fang 90
yang 50
ning 70

输出

fang 90
ning 70
yang 50
示例2

输入

3
1
fang 90
yang 50
ning 70
3
0
moolgouua 43
aebjag 87
b 67

输出

yang 50
ning 70
fang 90
aebjag 87
b 67
moolgouua 43

说明

第一组用例:
3
1
fang 90
yang 50
ning 70
升序排序为:
yang 50
ning 70
fang 90
第二组降序为:
aebjag 87
b 67
moolgouua 43  
import sys
from operator import itemgetter
case = list(sys.stdin)
while True:
    grade=[]
    n=int(case[0])
    
    order=int(case[1])
    for i in range(2,n+2):
        a,b = case[i].split(" ")
        grade.append([a,int(b)])
    if order==0:
        order=True
    else:
        order=False
    grade.sort(key=itemgetter(1),reverse=order)
    for x in grade:
        print(str(x[0])+' '+str(x[1]))
    if len(case)==n+2:
        break
    else:
        case=case[n+2:len(case)]
发表于 2021-03-16 18:49:18 回复(0)
while True:
    try:
        n=int(input())
        m=int(input())
        a=[]
        for i in range(n):
            a.append(input().split())
        a=sorted(a,key = lambda x:(int(x[1])),reverse=(1-m))
        for i in a:
            print(' '.join(i))
    except:
        break
发表于 2019-08-16 13:57:24 回复(0)
try:
    while 1:
        num = int(input())
        mode = int(input())
        names = []
        for i in range(num):
            names.append(input())
            names = sorted(names, key=lambda x: int(x.split()[1]), reverse=1-mode)
        for i in names:
            print(i)
except:
    pass

发表于 2019-06-25 18:27:28 回复(0)
n = int(input())
flag = int(input())

info = {}

for i in range(n):
    name = input().split( )
    info[name[0]] = int(name[1])
    
if flag==0:
    flag=True
elif flag==1:
    flag=False

info_1 = sorted(info.items(), key=lambda item:item[1], reverse=flag)


for i in range(n):
    print(info_1[i][0]+' '+str(info_1[i][1]))
  
思路比较简单,造一个字典,然后排序,可能是sorted函数的问题,分数相同的时候就会出错,跟样例差点
发表于 2019-05-27 16:12:06 回复(0)
try:
    while(True):
        num=int(input())
        updown=int(input())
        d={}
        for i in range(num):
            ls=input().split()
            d[ls[0]]=int(ls[1])
        if updown==0:
            sort_d=sorted(d.items(),key=lambda x: x[1],reverse=True)
        else:
            sort_d=sorted(d.items(),key=lambda x: x[1])
        for k,v in sort_d:
            print(k,v)
except:
    pass

l相同大小的谁前谁后呢 服了我的代码不行 懒得弄了
发表于 2019-04-11 11:18:38 回复(0)
while True:
    try:
        n=int(input())
        m=int(input())
        l=[]
        for _ in range(n):
            s=input().split(" ")
            l.append([s[0],int(s[1])])
        if m==0:
            l.sort(key=lambda x:x[1], reverse=True)
        else:
            l.sort(key=lambda x:x[1], reverse=False)
        for item in l:
            print(item[0],item[1])
    except:
        break
新手上路,这个小题踩了不少坑:
   1. Python代码一定要用以下的格式提交
while True:
    try:
        ...
    except:
        break
    2. 开始时用的dict类型存储的输入输出,使用sorted函数在本地测试通过,自测时发现有时不通过,出现排序不稳定的情况,而提交时的输出总是停在了结果的某个位置(好像就是有相同成绩的值)那里不动,推测应该是与sorted排序不稳定有关。改用list存储,使用list.sort即可通过。
(ps:据说sorted在Python2.2之后已经是稳定的了,为什么这里还是不稳定啊?)


发表于 2019-03-12 21:32:58 回复(0)
while True:
    try:
        num = int(input())
        whetherRev = (int(input())!=1)
        students = []
        for i in range(num):
            students.append(input().split())
        students.sort(key=lambda x:int(x[1]),reverse=whetherRev)
        for i in students:
            print(" ".join(i))
    except Exception:
        break
编辑于 2018-10-12 09:16:26 回复(0)
def Paixu(list1,w):
    if w == 0:
        return sorted(list1,key = lambda S : int(S[1]), reverse=True)
    elif w == 1:
        return sorted(list1, key=lambda S: int(S[1]), reverse=False)


N = int(input())
w = int(input())
list1 = [0] * N
for i in range(N):
    list1[i]= list(map(str,input().split()))

list1 = Paixu(list1,w)
for i in range(N):
    s = ""
    s += list1[i][0] + " " + list1[i][1]
    print(s)
你的输出为:
空。请检查一下你的代码,有没有循环输入处理多个case。

自测没问题,调试说输出为空???
发表于 2018-10-08 17:18:01 回复(0)
while True:
    try:
        n,flag,grade = int(input()),int(input()),[]
        for i in range(n):
            In = input().split()
            grade.append([In[0],int(In[1])])
        grade = sorted(grade,key = lambda x:x[1],reverse = not flag)
        for each in grade:
            print(each[0],each[1])
    except:
        break

发表于 2018-07-26 22:30:05 回复(0)

python解法,应该还可以简化。

这题的难点在于多条件排序,不过对于python来说不是问题,一个坑就是当倒序排时,名字出现的索引确不能倒序,还是要按出现的先后顺序,所以要加一个负号来平衡掉。

while True:
    try:
        dic=[]
        a,b=int(input()),input()
        isDesc=True if b=="0" else False
        for i in range(a):
            name, score = input().split()
            dic.append((name,int(score)))
        if isDesc:
            for i in sorted(dic, key=lambda item: (item[1],-dic.index(item)), reverse=isDesc):
                print(i[0] + " " + str(i[1]))
        else:
            for i in sorted(dic, key=lambda item: (item[1],dic.index(item))):
                print(i[0] + " " + str(i[1]))
    except:
        break
编辑于 2017-10-07 21:27:51 回复(7)
try:
    while 1:
        n, a, table = [input(), input(), []]
        for i in xrange(n):
            item = raw_input().split()
            table.append((item[0],int(item[1]), i))
        if a == 1:
            result = sorted(table, key=lambda x:(x[1], x[2]))
        else:
            result = sorted(table, key=lambda x:(x[1], -x[2]),reverse=True)
        for m, k, n in result:
            print m, k
except:
    pass

编辑于 2017-05-19 21:06:17 回复(0)