列表的构建

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”,关注了解程序员的烧脑日常。

接收list参数_Python 犄角旮旯--List相关推荐

  1. python怎么接收前端参数_Python常驻任务实现接收外界参数代码解析

    实现一个简单的常驻任务是容易的,写一个while True就可以了,但是同时要能接收外界传来的参数,就稍微有点复杂. 我第一个想到的是网络编程中的server/client模式 server作为常驻进 ...

  2. python 接收外部参数_python 接收处理外带的参数方法

    python 接收处理外带的参数方法 在执行python 代码的时候,有时候需要传递外面的参数进行处理 这个该怎么实现呢? 需要一个模块 from sys import argv 当然也可以直接只导入 ...

  3. python常驻运行_Python常驻任务实现接收外界参数代码解析

    实现一个简单的常驻任务是容易的,写一个while True就可以了,但是同时要能接收外界传来的参数,就稍微有点复杂. 我第一个想到的是网络编程中的server/client模式 server作为常驻进 ...

  4. SpringMVC框架 学习DAY_02 : 接收请求参数/向模板页面转发数据/重定向与转发 /Session

    1. 接收客户端提交的请求参数 1.1. 使用HttpServletRequest接收请求参数 在处理请求的方法的参数列表中,添加HttpServletRequest类型的参数,在处理请求的过程中,调 ...

  5. 【Groovy】闭包 Closure ( 闭包参数列表规则 | 默认参数列表 | 不接收参数 | 接收自定义参数 )

    文章目录 一.闭包参数列表 二.闭包参数列表代码示例 一.闭包参数列表 闭包的参数设置有如下情况 : 不接收参数 : 如果在定义闭包时 , 只写了 " -> " 符号 , 没 ...

  6. php接受post值报错,php接收post参数时报错怎么办

    php接收post参数时报错的解决办法:首先搜索[php.ini]中 [always_populate_raw_post_data ]:然后将前面的[;]去掉,并重启服务即可. php接收post参数 ...

  7. get request uni 参数_Python+request+unittest实现接口测试框架集成实例

    1.为什么要写代码实现接口自动化 大家知道很多接口测试工具可以实现对接口的测试,如postman.jmeter.fiddler等等,而且使用方便,那么为什么还要写代码实现接口自动化呢?工具虽然方便,但 ...

  8. python中自定义函数如何传递动态参数_python 函数的动态参数

    1. 函数的动态参数 1. *args 位置参数动态传参 2. **kwargs 关键字参数动态传参 顺序:位置参数, *args, 默认值, **kwargs def func(*args, **k ...

  9. java控制器接收请求参数_SpringMVC之接收请求参数和页面传参

    Spring接收请求参数 1,使用HttpServletRequest获取 Java代码 @RequestMapping("/login.do") public String lo ...

最新文章

  1. python高阶面试题_Python 爬虫面试题 170 道:2019 版
  2. Java线上问题排查思路及Linux常用问题分析命令学习
  3. Hadoop记录-监控几个思路
  4. 关于URL指向的icon的存储问题
  5. 9月11日学习内容整理:正则表达式,re模块
  6. .NET Core 3.0 一个 jwt 的轻量角色/用户、单个API控制的授权认证库
  7. 如何在虚拟机上安装wsus服务器,如何在Hyper-V虚拟机上安装WSUS服务器技巧
  8. java ref 应用类型_Java四种引用类型
  9. 2018腾讯内部转岗面试题3——找出数组中比左边大比右边的小的元素
  10. 《穷爸爸,富爸爸》读书笔记
  11. 前端开发 —— js 常用工具函数(utilities)
  12. Django Model出现的中文问题
  13. Flink 在众安保险金融业务的应用
  14. iFrame左树目录
  15. 免费中文Python电子书
  16. 实现类CAD的交互式命令系统
  17. SAP采购订单价格与信息记录价格不匹配
  18. 一种基于STM32F1 MCU的增量型编码器测速的方法
  19. 爬取免费代理,拥有自己的代理池
  20. 音频wav文件格式分析

热门文章

  1. python URLError,HTTPError 的异常处理
  2. 解决“Cannot merge new index 67208 into a non-jumbo instruction”的问题
  3. Android 自定义拍照,解决图片旋转,拍照参数设置兼容问题
  4. 对于未来chrome80 samesite问题的兼容解决方案
  5. 关于微信中的localStorage及使用cookie的解决方案
  6. OwinStartup不触发
  7. 如何在Python中便宜地获取大文件的行数?
  8. 将jQuery的复选框设置为“已选中”?
  9. 使用ros3d.js实现web 端3D建图
  10. 动态注册广播接收者,屏幕锁定Android