查找和排序
题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩都按先录入排列在前的规则处理。
示例:
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