【python学习】病人排队

【python学习】病人排队

前言:假期学习python,发现自己还是太菜,根本没有想象中吃c语言的老本那么容易。所以还是踏踏实实慢慢来吧

题目链接

简述题意:按照一定的规则对列表中的元素进行排序

需要注意的是,对每个病人建立一个列表,该列表应包含病人的ID,年龄以及排队顺序,以便于之后的排序操作



1. 关于基本输入输出
与c语言熟悉的scanf,printf不同,python的输入只有一种近乎直白的语句:input()

虽然直白简洁,但是显然由于输入数据类型的不同,只用一种语句显然不能满足所有的要求。所以,必须对输入的数据进行类型转化。实际上,python的input语句只接收字符串的输入,而要将字符串转换为int甚至list类型,则需要重新转换。

例如:n=int(input())可以表示输入一个整数

常用split()切片函数对单行数据输入进行处理(默认空格为分隔符),例如:

s=input().split()
x=int(s[0]),y=int(s[1])

可将单行输入的两个整数先存入到s这个列表中。注意,此时存放的仍是两个字符串(str类型),所以提取时还需进行数据的转换


 2.关于列表(list)的操作

 与c语言中的数组不同,python中拥有我个人认为更加强大(也更不好处理)的组合数据类型(元组tuple、列表list、字符串str、字典dict、集合set),每一种组合类型的基本操作都类似于c语言中的数组。

姑且把列表“等价于”数组(与其说“等价于”普通数组,不如更精确地说其“等价于”一个结构体数组),在这道题里,显然数组的每一个元素都会存放三个数据:年龄、ID、排队顺序。

所以,此题中的列表的每一个元素应当仍是一个(包含三个元素的)列表。

注意,列表的增添方式常用  append() 函数,具体操作如下:

a=[] #定义列表
a.append(["123",18,1]) #ID 年龄和排队顺序

3.关于sort函数:

 python中的sort函数用法为:a.sort(),其中a为一个列表。默认是由小到大排序。如果是对组合数据进行排序,则默认按照第1个数据到最后一个数据的优先级排序!

  此题的排序显然是要用复杂一点的判断条件,在c语言中会用到一个compare函数,其写法如下: 

bool cmp(struct x,struct y){
    if((x.age>=60&&y.age>=60&&x.age==y.age)||(x.age<60&&y.age<60))
       return x.order<y.order;
    else 
       return x.age>y.age;
}

在调用sort函数时只需加入cmp函数:sort(a,a+n,cmp)  即可。

在python中,key函数充当着cmp函数的角色。key函数为自定义比较函数,在python中的用法如下:

def f(x):
    return x%10
a=[25,240,36,12]
a.sort(key=f)
#即可按照个位数大小进行排序

在这道题里,我们需要关注两个数据:①是病人的age是否>=60 ②是病人的排队顺序。
而且,我们必须保证age>=60病人的优先级大于非老年人。

这样,我们根据python排序的性质,将原来的列表通过key函数进行转化,生成一个新的列表,该列表包含两个数据,第一个数据为age>=60?-age:0(这样就保证了老年人在第一个数据上的优先级),第二个数据则代表其排队顺序。

根据这个思路,我们得到了用于此排序算法的key函数:

def f(x):
    if x[1]>=60:
        return (-x[1],x[2])
    else:
        return (0,x[2])

 当数据预处理完毕后,我们只需调用:a.sort(key=f)  语句,即可完成对病人的排序


综上,写出代码如下:

def f(x):
    if x[1]>=60:
        return (-x[1],x[2])
    else:
        return (0,x[2])
n=int(input())
a=[]
for i in range(n):
    s=input().split()
    lst=[str(s[0]),int(s[1]),i]
    a.append(lst)
a.sort(key= f)
for i in range(n):
    print(a[i][0])

继续加油吧!!!
 

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fellyhosn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值