python sort 部分元素_Python 犄角旮旯--List
列表的构建
List 是 Python 中最常用的容器之一,它是一个可变(mutable)容器,也就是说 List 的内容可以被修改,这也意味着它不能作为 Dict 的 key,也不能出现在 set 中。List 的创建有以下几种方式:
- [] 是一个空列表;
- [a] 或者 [a, b] 构成一个列表;
- 用推导式创建列表, [el for el in range(10)];
- list() 或者 list(iterable) 创建列表,如果 literable 是一个列表,那么会创建这个列表的副本。
可以通过下面的方式快速扩展列表:
l = ['a'] * 5
其结果是 5 个 [‘a’] 拼接相当于 [‘a’, ‘a’, ‘a’, ‘a’, ‘a’]。
但需要注意这样的情况:
ll = [[]] * 3
ll[0].append('apple')
预想中结果应该是
[['apple'], [], []]
但实际上结果是:
[['apple'], ['apple'], ['apple']]
前面的代码相当于下面这样:
inner = []
outer = [inner, inner, inner]
inner.append('apple')
outer 的所有元素都是 inner 的引用,它们的变化是同时发生的。
就地排序
List 提供了 sort 方法排序,其原型是:
sort(*, key=None, reverse=False)
最后两个参数必须以命名参数提供,其中参数 key 应当是一个函数,接收一个列表元素作为参数,实际排序会采用 key 函数的返回值作为排序依据;reverse 表示逆序排列。
sort 方法的排序是 “就地” 完成,也就是说 sort 方法并不会创建原列表的副本,而是直接改变当前列表,这一点需要特别注意。如果有多种排序需要,应当用 copy 方法先创建列表的副本。
默认排序使用的是 List 元素的值,对于复杂对象,我们可以传入 key 函数,比如对 Person 对象分别以年龄、身高排序。
class Person:def __init__(self, name, age, length):self.name = nameself.age = ageself.length = lengthdef __repr__(self):return f'<class Person> name:{self.name}, age:{self.age}, length:{self.length}'__str__ = __repr__# 创建一个 Person 数组
staffs = [Person("A", 18, 180), Person("B", 12, 175), Person("D", 32, 170)]# 按 age 就地排序
def get_person_age(person):return person.agelist.sort(staffs, key = get_person_age)
print("sort by age-->", staffs)# 按身高就地排序,使用 lambda
list.sort(staffs, key = lambda person: person.length)
print("sort by length-->", staffs)
结果是这样的:
sort by age--> [<class Person> name:B, age:12, length:175, <class Person> name:A, age:18, length:180, <class Person> name:D, age:32, length:170]
sort by length--> [<class Person> name:D, age:32, length:170, <class Person> name:B, age:12, length:175, <class Person> name:A, age:18, length:180]
让自定义对象支持比较和排序
sort 方法实际上只使用了成员的 < 比较操作,我们也可以实现 __lt__() 方法让自定义对象支持 < 操作,直接排序。
class Person:def __init__(self, name, age, length):self.name = nameself.age = ageself.length = lengthdef __repr__(self):return f'<class Person> name:{self.name}, age:{self.age}, length:{self.length}'__str__ = __repr__def __lt__(self, obj):if not isinstance(obj, self.__class__):raise ValueError("Person instance only!")# 默认比较姓名return self.name < Orville's Ideas and Interests# 创建一个 Person 数组
staffs = [Person("A", 18, 180), Person("B", 12, 175), Person("D", 32, 170)]# 直接排序
list.sort(staffs)
print("sort by name-->", staffs)
达到预期排序结果:
sort by name--> [<class Person> name:A, age:18, length:180, <class Person> name:B, age:12, length:175, <class Person> name:D, age:32, length:170]
排序中的异常
由于 sort 方法是 “就地” 操作,如果我们在排序中出现异常中断操作,那么 List 会处于部分被修改的不确定状态。
Python 官方文档docs.python.org
首发公众号 “江川Go”,关注了解程序员的烧脑日常。
python sort 部分元素_Python 犄角旮旯--List相关推荐
- python sort 部分元素_Python 简单排序算法-选择、冒泡、插入排序实现
写文章主要是记录自己每天学习的东西,本篇文章主要介绍数据结构中常用的简单的排序算法,虽然这些算法用Python实现起来不是十分的高效,不如c.java之类的运行速度快,应用Python实现主要是为了: ...
- python添加数组元素_Python列表附录–如何向数组添加元素,并附带示例说明
python添加数组元素 欢迎 (Welcome) Hi! If you want to learn how to use the append() method, then this article ...
- python 打印列表元素_Python程序以不同方式打印列表元素
python 打印列表元素 In this program – we are going to learn how can we print all list elements, print spec ...
- python list 去除元素_python中如何删除list元素?
我们在使用微博的时候,看到关注的内容,会评论加入这件事的讨论.但是随着事态的发现,你可能会发现自己的言论不正确,你会选择删除.删除在我们生活中是很常见的事情,谁都不希望错误发生,一旦发生,就要删除改正 ...
- python列表取出元素_python中的列表,添加元素,获取元素,删除元素,列表分片,常用操作符...
一. 创建列表,分为创建普通列表,混合列表,和空列表.其中混合列表是指string,int, float等都可以写在同一个列表里,空列表是指列表可以为空 二. 在列表添加成员方法 1. append( ...
- python去重复元素_python 去除单个list中的重复元素
原博文 2020-02-23 08:31 − python中使用set 的方法,去除单个list中重复的元素并且保持元素的先后顺序不变. ``` list1 = ['a','a','b','c','d ...
- python sort 逆序_python实现·十大排序算法之插入排序(Insertion Sort)
简介 插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法实现步骤 从第一个元素开 ...
- python sort 多级排序_python sort、sorted高级排序技巧
Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列. 1)排序基础 简单的升序排序是非常容易的.只需要调用sorte ...
- python修改列表元素_python 3 基础之列表和列表添加元素、修改元素、查找元素、删除元素、排序、嵌套、取最值...
列表(与字符串相似,字符串用引号,而列表用中括号和逗号.引号,列表中可以保存多种数据类型) # 定义一个列表,格式:列表名=[元素1,元素2.元素3.......] 列表使用与字符串的索引编号一致,如 ...
最新文章
- 使用工具类时尽量使用私有的无参构造函数
- java设计模式:Singleton模式
- android Button源码分析
- Safari tabindex 不工作的问题 (误
- POJ - 3662 Telephone Lines(分层图最短路)
- 分支管理---创建与合并分支
- 《iVX 高仿美团APP制作移动端完整项目》03 推介信息及推荐商家分析及制作
- 花器官身份基因与靶基因间的调控进化情况
- 多线程笔试题(linux)
- 【渝粤教育】国家开放大学2018年秋季 0248-21T电工电子技术 参考试题
- 执行计划之CONCATENATION
- Nmap命令参数介绍
- 用微信公众号控制ESP8266的LED,进一步使用微信当遥控器
- 关于Windows mobile设备中心,即同步软件,打开卡住,或是无法开启 基于 Windows Mobile 2003 的设备连接 服务的
- 使用SSH密钥连接阿里云linux服务器
- 最好的60个国外壁纸网站
- 实验一 验证删除快照时VMware会改变父快照或基础磁盘
- 谷歌广告投放,谷歌广告怎么投放?
- Secret的三种形式
- QPushButton设置响应按钮为回车键
热门文章
- English trip V1 - 22. My Life Teacher:Emily Key: describe talk about past 过去式
- 潜入java内存结构
- Mysql 内置函数
- Yii2 获取URL的一些方法
- Ubuntu 中sendmail 的安装、配置与发送邮件的具体实现
- arm开发板6410/2440上mjpg-streamer网络视频服务器移植
- 职业生涯的8种德---非常重要
- Mysql 日志系统 redo log 和 binlog
- 智能算法把奥巴马识别成白人,AI也学会歧视了?
- GitHub移动App上线:四大特性,手机端无缝完成git任务