列表的构建

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相关推荐

  1. python sort 部分元素_Python 简单排序算法-选择、冒泡、插入排序实现

    写文章主要是记录自己每天学习的东西,本篇文章主要介绍数据结构中常用的简单的排序算法,虽然这些算法用Python实现起来不是十分的高效,不如c.java之类的运行速度快,应用Python实现主要是为了: ...

  2. python添加数组元素_Python列表附录–如何向数组添加元素,并附带示例说明

    python添加数组元素 欢迎 (Welcome) Hi! If you want to learn how to use the append() method, then this article ...

  3. python 打印列表元素_Python程序以不同方式打印列表元素

    python 打印列表元素 In this program – we are going to learn how can we print all list elements, print spec ...

  4. python list 去除元素_python中如何删除list元素?

    我们在使用微博的时候,看到关注的内容,会评论加入这件事的讨论.但是随着事态的发现,你可能会发现自己的言论不正确,你会选择删除.删除在我们生活中是很常见的事情,谁都不希望错误发生,一旦发生,就要删除改正 ...

  5. python列表取出元素_python中的列表,添加元素,获取元素,删除元素,列表分片,常用操作符...

    一. 创建列表,分为创建普通列表,混合列表,和空列表.其中混合列表是指string,int, float等都可以写在同一个列表里,空列表是指列表可以为空 二. 在列表添加成员方法 1. append( ...

  6. python去重复元素_python 去除单个list中的重复元素

    原博文 2020-02-23 08:31 − python中使用set 的方法,去除单个list中重复的元素并且保持元素的先后顺序不变. ``` list1 = ['a','a','b','c','d ...

  7. python sort 逆序_python实现·十大排序算法之插入排序(Insertion Sort)

    简介 插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法实现步骤 从第一个元素开 ...

  8. python sort 多级排序_python sort、sorted高级排序技巧

    Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列. 1)排序基础 简单的升序排序是非常容易的.只需要调用sorte ...

  9. python修改列表元素_python 3 基础之列表和列表添加元素、修改元素、查找元素、删除元素、排序、嵌套、取最值...

    列表(与字符串相似,字符串用引号,而列表用中括号和逗号.引号,列表中可以保存多种数据类型) # 定义一个列表,格式:列表名=[元素1,元素2.元素3.......] 列表使用与字符串的索引编号一致,如 ...

最新文章

  1. 使用工具类时尽量使用私有的无参构造函数
  2. java设计模式:Singleton模式
  3. android Button源码分析
  4. Safari tabindex 不工作的问题 (误
  5. POJ - 3662 Telephone Lines(分层图最短路)
  6. 分支管理---创建与合并分支
  7. 《iVX 高仿美团APP制作移动端完整项目》03 推介信息及推荐商家分析及制作
  8. 花器官身份基因与靶基因间的调控进化情况
  9. 多线程笔试题(linux)
  10. 【渝粤教育】国家开放大学2018年秋季 0248-21T电工电子技术 参考试题
  11. 执行计划之CONCATENATION
  12. Nmap命令参数介绍
  13. 用微信公众号控制ESP8266的LED,进一步使用微信当遥控器
  14. 关于Windows mobile设备中心,即同步软件,打开卡住,或是无法开启 基于 Windows Mobile 2003 的设备连接 服务的
  15. 使用SSH密钥连接阿里云linux服务器
  16. 最好的60个国外壁纸网站
  17. 实验一 验证删除快照时VMware会改变父快照或基础磁盘
  18. 谷歌广告投放,谷歌广告怎么投放?
  19. Secret的三种形式
  20. QPushButton设置响应按钮为回车键

热门文章

  1. English trip V1 - 22. My Life Teacher:Emily Key: describe talk about past 过去式
  2. 潜入java内存结构
  3. Mysql 内置函数
  4. Yii2 获取URL的一些方法
  5. Ubuntu 中sendmail 的安装、配置与发送邮件的具体实现
  6. arm开发板6410/2440上mjpg-streamer网络视频服务器移植
  7. 职业生涯的8种德---非常重要
  8. Mysql 日志系统 redo log 和 binlog
  9. 智能算法把奥巴马识别成白人,AI也学会歧视了?
  10. GitHub移动App上线:四大特性,手机端无缝完成git任务