首页 > 试题广场 >

成绩排序

[编程题]成绩排序
  • 热度指数:224449 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}对于给出的 n 位同学的姓名和成绩,根据输入要求,按成绩升序或降序排列。

输入描述:
\hspace{15pt}第一行输入一个整数 n \left(1 \leqq n \leqq 200\right) 代表学生人数。
\hspace{15pt}第二行输入一个整数 op \left(0 \leqq op \leqq 1\right) 代表排序方式,其中,0 表示按成绩降序,1 表示按成绩升序。
\hspace{15pt}此后 n 行,第 i 行输入一个长度为 1 \leqq {\rm len}(s_i) \leqq 20、由大小写字母混合构成的字符串 s_i 代表第 i 个学生的姓名。随后,在同一行输入一个整数 a_i \left(1 \leqq a_i \leqq 100\right) 代表这个学生的成绩。

\hspace{15pt}除此之外,保证输入数据中不存在重复的学生姓名。


输出描述:
\hspace{15pt}根据输入的排序方式,按照成绩升序或降序输出所有学生的姓名和成绩。对于每一名学生,新起一行。输出学生的姓名和成绩,用空格分隔。
示例1

输入

3
0
fang 90
yang 50
ning 70

输出

fang 90
ning 70
yang 50

说明

\hspace{15pt}在这个样例中,op = 0,因此按成绩降序排序。
示例2

输入

3
1
fang 90
yang 50
ning 70

输出

yang 50
ning 70
fang 90

说明

\hspace{15pt}在这个样例中,op = 1,因此按成绩升序排序。
用defaultdict作为答案,用成绩作为key,名字存储到字典的list里面 需要注意一下str的转换,在字典取值和print的时候需要手动转换为str的形式。
from collections import defaultdict
while True:
    try:
        population = int(input())
        ori = int(input())
        rank = defaultdict(list)
        
        for i in range(population):
            info = input()
            info = info.split(' ')
            name = info[0]
            score = info[1]
            rank[score].append(name)
        temp = list(rank.keys())
        op = map(int, temp)
        re = sorted(op) if ori == 1 else sorted(op,reverse=True)
        
        for s in re:
            for k in range(len(rank[str(s)])):
                print(str(rank[str(s)][k]) + ' ' + str(s))

    except:
        break


编辑于 2022-07-02 15:30:02 回复(0)
while True:
    try:
        num = int(input())
        rev = int(input())
        revers = True
        if rev == 1:
            revers = False
        dic = {}
        for i in range(num):
            records = input().split()
            dic[records[0]] = int(records[1])
        sdic = dict(sorted(dic.items(), key= lambda item:item[1], 
                          reverse = revers))
        # print(sdic)
        for key, value in sdic.items():
            print(key, end = ' ')
            print(value, end = '\n')
    except:
        break

发表于 2021-07-11 01:21:54 回复(0)
while True:
    try:
        aa=[]#初始化aa 列表
        n = int(input())#读取个数
        reorno = input()#读取升序降序
        for i in range (n):
            a,b = input().split()#连续读取全部学生
            b = int(b)#第二项转换为int用于排序
            aa.append((a,b))#添加入列表以(a,b)形式
        if reorno == '1':
            aa=sorted(aa, key=lambda x:x[1]) #以0起始第1位为key,排序
        elif reorno == '0':
            aa=sorted(aa, key=lambda x:x[1],reverse=True)#以0起始第1位为key,排序,降序
        for i in range (len(aa)):
            print(aa[i][0]+ " "+ str(aa[i][1]))#逐个读取结果打印
    except:
        break

发表于 2021-06-30 15:35:50 回复(0)
while True:
    try:
        num = int(input())
        order = int(input())
        scores = []
        for i in range(num):
            record = input()
            scores.append(record.split(' '))
            scores[i][1] = int(scores[i][1])
        if order == 0:
            sorted_scores = sorted(scores, key= lambda x:x[1], reverse=True)
        elif order == 1:
            sorted_scores = sorted(scores, key=lambda x: x[1])
        for i in range(num):
            print(sorted_scores[i][0], sorted_scores[i][1])
    except EOFError:
        break

编辑于 2021-03-24 13:38:00 回复(0)
import collections
while True:
    try:
        a1=[]
        a=int(input())
        flag1=int(input())
        
        #print(type(b))
        #print(b)
        for i in range(a):
            str1=input()
            a1.append(str1)
        
        a2=sorted(a1,key=lambda x:int(x.split()[1]),reverse=(flag1==0))
             
        for i in a2:
         print(i)
    except:
        break
发表于 2021-02-18 17:29:25 回复(0)
计数排序,线性时间复杂度
while True:
    try:
        n, ascending = int(input()), int(input())
        marks = []
        for _ in range(n):
            marks.append(input().split())
        temp = [0] * 101
        for m in marks:
            temp[int(m[1])] += 1
        sum = 0
        if ascending:
            for i in range(101):
                if temp[i]:
                    sum, temp[i] = sum+temp[i], sum
        else:
            for i in range(100, -1, -1):
                if temp[i]:
                    sum, temp[i] = sum+temp[i], sum
        new_marks = [0] * n
        for m in marks:
            new_marks[temp[int(m[1])]] = m
            temp[int(m[1])] += 1
        for m in new_marks:
            print(" ".join(m))
    except:
        break


发表于 2020-12-18 00:28:41 回复(0)
while True:
    try:
        num, kind = int(input().strip()), input().strip()
        L = []

        for i in range(num):
            name, score = input().strip().split(' ')
            L.append((name, int(score)))
        if kind == '0':
            L = sorted(L, key=lambda x: x[1], reverse=True)
        else:
            L = sorted(L, key=lambda x: x[1], reverse=False)

        for name_score in L:
            print(name_score[0] + ' ' + str(name_score[1]))
    except:
        break

编辑于 2020-12-03 16:39:31 回复(0)
Python 5行解法,逻辑清晰,简单易懂
Python 的 sorted 函数采用的是稳定排序的方式,所以它天然满足了题目对于排序的第二个要求。
其实,即便它不采用稳定排序,我们也可以通过 enumerate 这个函数得到原始下标位置的,然后只要通过 sorted 的key参数指定按照下标升序就可以解决,key是可以一次性指定多个排序条件的。当然,这里我们不需要,它默认是稳定的。我只是做个拓展。
while True:
    try:
        n, order = int(input()), int(input())
        message = [tuple(input().strip().split()) for i in range(n)]
        if order == 0:
            out = sorted(message, key=lambda x: -int(x[1]))
        else:
            out = sorted(message, key=lambda x: int(x[1]))
        [print(' '.join(i)) for i in out]
    except:
        break
        


发表于 2020-09-30 22:25:56 回复(0)

Python 解法

if __name__ == "__main__":
    while True:
        try:
            n = int(input())
            t = int(input())
            data = [input().strip().split() for i in range(n)]
            data.sort(key=lambda x: int(x[1]),reverse = not t)#排序的关键字是int(x[1]),直接x[1]会报错
            for l in data:
                print(" ".join(l))
        except:
            break
发表于 2020-09-22 23:34:11 回复(0)
n = int(input())
m = int(input())
flag = True if m==0 else False
li =[]
for i in range(n):
    (s11,s12)=input().split()
    li.append((s11,s12))
print(li)

li =sorted(li,key=lambda s:s[1],reverse=flag)
for i in range(n):
    print(' '.join(li[i]))
在本地就可以,为什么通过不了?
发表于 2020-08-30 16:50:15 回复(0)
求教为什么spyder上可以通过 但是线上测试只能随机输入一个成绩结果
while True:
    try:
        num=int(input())
        order=int(input())
        dictionary={}
        for i in range(num):
            seq=input().split()
            dictionary[seq[0]]=int(seq[1])
        if(order==0):
            ordered=dict(sorted(dictionary.items(),key=lambda x:x[1],reverse=True))
        else:
            ordered=dict(sorted(dictionary.items(),key=lambda x:x[1]))
        for i,j in ordered.items():
            print(i,end=' ')
            print(j)
    except:
        break
发表于 2020-08-11 18:25:12 回复(0)
人生苦短!
while True:
    try:
        n, flag = int(input()), int(input())
        score = []
        for i in range(n):
            score.append(input().split())
        for j in sorted(score, key=lambda x:int(x[1]), reverse=not flag):
            print(' '.join(map(str, j)))
    except:
        break


发表于 2020-08-11 13:39:45 回复(0)
直接按成绩排序,不要用字典,这个平台python版本在字典处理上会自动无序处理,无视先后加入顺序,另外如果同名的话新的成绩会覆盖原来的成绩。
while True:
    try:
        N,a,l = eval(input()),input(),[]
        for i in range(N):
            l.append(input().split())
        if a == '1':
            l.sort(key = lambda x:eval(x[1]),reverse = False)
        elif a == '0':
            l.sort(key = lambda x:eval(x[1]),reverse = True)
        for k in l:
            print(' '.join(k))
    except:
        break

编辑于 2020-05-23 21:09:08 回复(0)
while 1:
    try:
        N, flag = int(input()), input()
        mylist  = []
        for i in range(N):
            inlist = input().split()
            j = 0
            for k in range(len(mylist)):
                if flag == '0':
                    if int(inlist[1]) > int(mylist[k][1]):
                        j = 1
                        mylist.insert(k,inlist)
                        break
                else:
                    if int(inlist[1]) < int(mylist[k][1]):
                        j = 1
                        mylist.insert(k,inlist)
                        break
            if j == 0:
                mylist.append(inlist)
        for i in mylist:
            print(' '.join(i))
    except:
        break

插入排序比较适合这类问题
发表于 2020-05-11 20:06:50 回复(0)
while True:
    try:
        n=int(input())
        flag=int(input())
        dic=[]
        for i in range(n):
            dic.append(input().split())
        if not flag:
            for i in sorted(dic,key=lambda x:int(x[1]),reverse=True):
                print(' '.join(i))
        else:
            for i in sorted(dic,key=lambda x:int(x[1])):
                print(' '.join(i))
    except:
        break
lambda x:int(x[1])这里不加int就只能通过10%,猜测是字符串数字的问题

发表于 2020-04-03 01:42:21 回复(0)
while True:
    try:
        num = int(input())
        flag = int(input())
        result = []
        results = []
        for i in range(num):
            m = input().split()
            name = m[0]
            score = int(m[1])
            result.append((name,score))

        if flag == 0:
            results = sorted(result,key=lambda x : x[1],reverse=True)
        elif flag == 1:
            results = sorted(result, key=lambda x: x[1])

        for i in results:
            print(i[0]+' '+(str(i[1])))
    except:
        break

发表于 2020-03-28 21:57:43 回复(0)
while 1:
    try:
        nums=int(input())
        flag=int(input())
        ls=[]
        for i in range(nums):
            ls.append(input().split())
        if flag==0:
            ls.sort(key=lambda x:int(x[1]),reverse=True)
        else:
            ls.sort(key=lambda x:int(x[1]),reverse=False)
        for i in ls:
            print(" ".join(i))
    except:
        break

发表于 2020-03-04 12:52:34 回复(0)

Python 两行解

运行时间:25ms

占用内存:3436k

while 1:
    try:
        n,m = input(),input()
        print("\n".join([" ".join(i) for i in sorted([input().split() for _ in range(int(n))], key=lambda x:int(x[1]), reverse=0 if m == '1' else 1)]))
    except:
        break



编辑于 2020-04-29 13:50:56 回复(0)
# -*- coding: utf-8 -*-
# !/usr/bin/python3
# 解题思路,以成绩为key把数据保存在一个字典里
# value为名字列表,按照成绩排序,使用排序后的成绩列表控制输出

while True:
    try:
        n = int(input())
        o = int(input())

        dic = dict()
        for i in range(n):
            name, score = input().split()
            if int(score) not in dic:
                dic[int(score)] = [name]
            else:
                dic[int(score)].append(name)

        ls = dic.keys()
        if o == 0:
            ls = sorted(ls, reverse=True)
            for i in ls:
                while dic[i]:
                    print(dic[i].pop(0) + ' ' + str(i))
        else:
            ls = sorted(ls)
            for i in ls:
                while dic[i]:
                    print(dic[i].pop(0) + ' ' + str(i))

    except:
        break
        

发表于 2019-11-27 17:42:12 回复(0)