Python 元组列表排序:初学者可能忽视的细节
P1085 [NOIP2004 普及组] 不高兴的津津
题目描述
津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。
输入格式
输入包括 \(7\) 行数据,分别表示周一到周日的日程安排。每行包括两个小于 \(10\) 的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。
输出格式
一个数字。如果不会不高兴则输出 \(0\),如果会则输出最不高兴的是周几(用 \(1, 2, 3, 4, 5, 6, 7\) 分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。
样例输入
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.[编程入门]三个数字的排序),只是简单的记录了一下,并没有过多深究。但知识就是这样,今天无视它,改天它就掐住了你的脖子。
顺便摘抄一段最近看到的话:
“我非常喜欢的一个东西,是一个人十三四岁的夏天,在路上捡到一支真枪。因为年少无知,天不怕地不怕,他扣下扳机。没有人死,也没有人受伤。他认为自己开了空枪。后来他三十岁或者更老,走在路上听到背后有隐隐约约的风声。他停下来,回过身去,子弹正中眉心。”
“果然,在那明媚的阳光中传来了那一声枪响。那枪声沉闷之极。”
——《我与地坛》史铁生
Python 元组列表排序:初学者可能忽视的细节的更多相关文章
- Python的列表排序
Python的列表排序 本文为转载,源地址为:http://blog.csdn.net/horin153/article/details/7076321 在 Python 中, 当需要对一个 list ...
- python元组 列表 (取值、替换、插入、添加、删除)
1.元组 列表 字典 元组( 元组是不可变的) hello = (1,2,3,4,5) type(hello)
- Python 元组遍历排序操作方法
在Python不可变数据类型中,有一个比较重要的角色那就是元组( tuple ).如果某个对像被定义为元组类型,那么就意味着它的值不能被修改,除非重新定义一个新的对像.元组和List列表常被放在一起进 ...
- python 元组 列表 字典
type()查看类型 //取整除 **幂 成员运算符: in x在y序列中,就返回true 反之 not in 身份运算符: is is not 逻辑运算符 and or not 字符编码 问题 ...
- python小记列表排序
a=[('b',4),('a',7),('c',2)] 正向排序a.sort() 反向排序:a.sort(reverse=True) 对第二关键字排序 a.sort(lambda x,y:cmp(x[ ...
- python中列表排序,字典排序,列表中的字典排序
#-*- encoding=utf-8 -*- # python3代码 import operator 一. 按字典值排序(默认为升序) x = {1:2, 3:4, 4:3, 2:1, 0:0} 1 ...
- 【380】python 获取列表排序后的索引列表
参考:Equivalent of Numpy.argsort() in basic python? - Stack Overflow 通过 enumerate 实现 [i for i,v in sor ...
- python 字典列表排序operator.itemgetter()
举例: import operator x = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}] sorted_x = sorted(x, ...
- python 元组列表合并
#create a tuple l = [(,), (,), (,)] print(list(zip(*l)))
- python 元组列表转为字典
#create a list l = [(), (), (), (), (), ()] d = {} for a, b in l: d.setdefault(a, []).append(b) prin ...
随机推荐
- Spring Cloud Alibaba 从入门到精通(2023)
Alibaba Cloud 简介 Spring Cloud Alibaba 即 Alibaba Cloud ,基于 Spring Cloud 构建,同时封装了阿里巴巴的 Nacos.Sentinel ...
- mindxdl--common--head_handler.go
// Copyright (c) 2021. Huawei Technologies Co., Ltd. All rights reserved.// Package common the commo ...
- Day19:属性封装详解
属性封装详解 封装即隐藏一些数据,让外部不能直接访问,而是需要通过一些方法才能设置或者访问. 首先我们来看未封装的属性被外部调用的情况 public class Students{//创建一个学生类 ...
- 我的Vue之旅 11 Vuex 实现购物车
Vue CartView.vue script 数组的filter函数需要return显式返回布尔值,该方法得到一个新数组. 使用Vuex store的modules方式,注意读取状态的方式 this ...
- python-面向过程与函数式
面向过程与函数式 面向过程 "面向过程"核心是"过程"二字,"过程"指的是解决问题的步骤,即先干什么再干什么......,基于面向过程开发程 ...
- 【JVM调优】Day01:Garbage的概念、垃圾回收的算法(标记清除、拷贝、标记压缩)、各种垃圾回收器(Serial、Parallel、CMS并发)及存在的问题
〇.前言 简历写上:熟悉GC常用算法,熟悉常见垃圾回收器.具有实际JVM调优实战经验 瞬间涨3k 一.什么是garbage Java中垃圾回收器自动进行垃圾回收,不用自己回收 new 对象在内存中,c ...
- 不用USB,通过adb无线调试安卓手机页面
以前真机调试手机页面,都是使用数据线连接手机和电脑,近日身边没有USB数据线,折腾了下如何不依赖数据线只用无线调试手机页面,教程如下. 本教程适用于安卓11以及以上版本.否则应该使用USB数据线连接. ...
- Python Excel 处理模块 : OpenPyXL
OpenPyXL模块使用方法 以下是介绍OpenPyXL的基本使用,不涉及样式和合并单元格的跨行操作 一般来说,对于大名鼎鼎的xlrd,xlwt和xlutils三个模块,Excel操作有3个基本状态 ...
- 什么是JS?JS的用途?
一.JavaScript是什么?它有什么作用? JavaScript是一种运行在客户端的脚本语言,简称JS,属于解释性语言.它是一行翻译执行完以后再进行下一行,代码不进行预编译. JavaScript ...
- 微软跨平台maui开发chatgpt客户端
image 什么是maui .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动(ios,andriod)和桌面(windows,mac)应 ...