python 排名函数_分数排名(Python),成绩,排序,python

查找和排序

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

示例:

jack 70

peter 96

Tom 70

smith 67

从高到低 成绩

peter 96

jack 70

Tom 70

smith 67

从低到高

smith 67

jack 70

Tom 70

peter 96

输入描述:

输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开

输出描述:

按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开

分析:

用到的知识:

1.sorted函数(这是一个稳定的排序方法)

sorted( iterable, key, reverse)

(1)iterable:是可迭代类型的数据;

(2)key:用列表元素的某个属性和函数进行作为关键字,有默认值,迭代集合中的一项;(一般用key=lambda x:x[i] ,lambda x:x[i] 是一个匿名函数,i为几就是第几个数字,如果是用的字典x[0]就是按照字典的key排序,x[1]就是按照字典的value排序 )

(3)reverse:排序规则. reverse = True 或者 reverse = False,有默认值,默认为升序排列False(即默认从小到大排序)

2.join()函数

'sep'.join(seq)

参数说明

sep:分隔符。可以为空

seq:要连接的元素序列、字符串、元组、字典

意思就是以sep作为分隔符,将seq所有的元素合并成一个新的字符串

比如 ’ '.join(new)就是以空格作为分隔符,将new里面的元素合并为一个新的字符串

正确代码

import math

import os

try:

while True:

n=int(input())

flag=int(input())

keys = []

for i in range(n):

s=str(input())

value = s.split(' ',1)

keys.append(value)

if(flag==0):

new=sorted(keys, key=lambda d: int(d[1]),reverse=True)

for i in range(n):

print(' '.join(new[i]))

else:

new=sorted(keys, key=lambda d: int(d[1]),reverse=False)

for i in range(n):

print(' '.join(new[i]))

except:

pass

错误写法分析:

看到题目第一想法就是写字典,然后运行发现,采用字典的话,如果有相同名字的人,那么会前一个人的成绩会被后一个人覆盖

错误写法(注意):

ac40%

import math

import collections

try:

while True:

n=int(input())

flag=int(input())

dict1 = collections.OrderedDict() #这种写法可以避免字典乱序,避免每次编译之后字典种元素的位置不一样

key = []

for i in range(n):

s=str(input())

value = s.split(' ',1)#利用空格将字符串分开放进字典

dict1[value[0]]=value[1]

key.append(value[0])

if(flag==0):

new=collections.OrderedDict(sorted(dict1.items(), key=lambda d: int(d[1]),reverse=True))#排序函数

for i in new.keys():

print(i,new[i])

else:

new=collections.OrderedDict(sorted(dict1.items(), key=lambda d: int(d[1]),reverse=False))

for i in new.keys():

print(i,new[i])

except:

pass

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值