Python 元组列表排序:初学者可能忽视的细节
P1085 [NOIP2004 普及组] 不高兴的津津#
题目描述#
津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。
输入格式#
输入包括
输出格式#
一个数字。如果不会不高兴则输出
样例输入#
5 3
6 2
7 2
5 3
5 4
0 4
0 6
样例输出#
3
解题思路#
将数据记录为元组列表,例如:[(1, 2), (3, 4), ...] ,每个元组记录当天的数据,元组第一位为当天的上课时间,第二位为当天的日期(星期几)。
存储数据的方法相同,最后比较输出结果的方法有两种。
方法 1#
li = []
for i in range(7):
a, b = map(int, input().split())
li.append((a+b, i+1))
li.sort()
if li[6][0] > 8:
for i in range(6,-1,-1):
if li[i-1][0] != li[i][0]:
print(li[i][1])
break
else:
print(0)
对列表进行排序,list.sort()
默认升序排列,所以只需要判断最后一个元组内的上课时间是否大于 8 小时,决定是否要输出 0 ;
当上课时间的最大值大于 8 时,倒序循环查找目标日期。存在上课时间相同的多个元组时,刚刚的排序操作会将日期较小的放在前面,所以需要在循环内去判断 i-1
位置是否等于 i
位置。
如果不等,输出当前元组的日期并跳出循环即可;如果相等,进入下一轮循环继续比较。
方法 2#
li = []
for i in range(7):
a, b = map(int, input().split())
li.append((a+b, i+1))
if max(li)[0] > 8:
print(max(li, key=lambda li:li[0])[1])
else:
print(0)
该方法使用 max 函数 进行最大值选取。
与刚刚的排序方法不同,max() 只输出 元组内元素之和最大 的元组,也就是说如果存在:[(9, 3), (9, 5)] ,它会返回 (9, 5) 这个元组,我们就无法得到真正的答案 (9,3)。
这时候就需要使用指定选取最大值的方法(函数),通过设置参数 key=函数()
来实现,函数部分实现 返回元组内第一个元素 即可,此处使用了匿名函数 lambda ,对应普通函数为:
def takeFirst(li):
return li[0]
对于 key
的理解,我最初走入了一个误区:li[0]
不是列表 li
的第一个元素吗,应该是一个元组, 这怎么能用来排序啊?
抱着这个疑问我查阅了一些资料,大多说的比较笼统,直到看到这篇文章: 理解sort()函数中的key ,我终于是理解了。
key
关键字指向的函数,会在排序前先执行。换句话说,它会在遍历迭代对象时,对迭代对象中的 每一个元素 进行一次操作。
假如有列表 li = [(1,2), (5,6), (3,4)]
,对其进行排序(sort函数 和 max函数 都可以设置 key ),设置 key
为上方的 takeFirst() 函数。
当对 li
进行排序时,首先遍历列表中的元素(元组),对每个元素均执行 takeFirst() 函数,也就是说选出 [1, 5, 3] 来,对其进行排序得到 [1, 3, 5] ,再将这个顺序对应到 li
上,就可以得到排序后的列表 li = [(1,2), (3,4), (5,6)]
,至此排序完成。
写在最后#
第一次遇到 key
参数时(刷题笔记 - 1043.[编程入门]三个数字的排序),只是简单的记录了一下,并没有过多深究。但知识就是这样,今天无视它,改天它就掐住了你的脖子。
顺便摘抄一段最近看到的话:
“我非常喜欢的一个东西,是一个人十三四岁的夏天,在路上捡到一支真枪。因为年少无知,天不怕地不怕,他扣下扳机。没有人死,也没有人受伤。他认为自己开了空枪。后来他三十岁或者更老,走在路上听到背后有隐隐约约的风声。他停下来,回过身去,子弹正中眉心。”
“果然,在那明媚的阳光中传来了那一声枪响。那枪声沉闷之极。”
——《我与地坛》史铁生
作者:Koi.C
出处:https://www.cnblogs.com/KoiC/p/17125598.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
声明:转载或使用请注明本文地址,感谢您的阅读!如果文章内容帮到了您,烦请点一下推荐,不胜感激!
欢迎关注个人公众号!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端