python 合并列表的八种方法
作者:写代码的明哥 发布时间:2022-06-10 10:07:29
目录
1. 最直观的相加
2. 借助 itertools
3. 使用 * 解包
4. 使用 extend
5. 使用列表推导式
6. 使用 heapq
7. 借助魔法方法
8. 使用 yield from
Python 语言里有许多(而且是越来越多)的高级特性,是 Python 发烧友们非常喜欢的。在这些人的眼里,能够写出那些一般开发者看不懂的高级特性,就是高手,就是大神。
但你要知道,在团队合作里,炫技是大忌。
为什么这么说呢?我说下自己的看法:
越简洁的代码,越清晰的逻辑,就越不容易出错;
在团队合作中,你的代码不只有你在维护,降低别人的阅读/理解代码逻辑的成本是一个良好的品德
简单的代码,只会用到最基本的语法糖,复杂的高级特性,会有更多的依赖(如语言的版本)
1. 最直观的相加
使用 + 对多个列表进行相加,你应该懂,不多说了。
>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>> list03 = [7,8,9]
>>>
>>> list01 + list02 + list03
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
2. 借助 itertools
itertools 在 Python 里有一个非常强大的内置模块,它专门用于操作可迭代对象。
在前面的文章中也介绍过,使用 itertools.chain()
函数先可迭代对象(在这里指的是列表)串联起来,组成一个更大的可迭代对象。
最后你再利用 list 将其转化为 列表。
>>> from functools import chain
>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>> list03 = [7,8,9]
>>>
>>> list(chain(list01, list02, list03))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
3. 使用 * 解包
使用 * 可以解包列表。 * 和 ** 常用在函数定义时,设置可变参数。
现在我将它单独拿出来用在多个列表的合并。
示例如下:
>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>>
>>> [*list01, *list02]
[1, 2, 3, 4, 5, 6]
>>>
4. 使用 extend
在字典中,使用 update 可实现原地更新,而在列表中,使用 extend 可实现列表的自我扩展。
>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>>
>>> list01.extend(list02)
>>> list01
[1, 2, 3, 4, 5, 6]
5. 使用列表推导式
Python 里对于生成列表、集合、字典,有一套非常 Pythonnic 的写法。
那就是列表解析式,集合解析式和字典解析式,通常是 Python 发烧友的最爱,那么今天的主题:列表合并,列表推导式还能否胜任呢?
当然可以,具体示例代码如下:
>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>> list03 = [7,8,9]
>>>
>>> [x for l in (list01, list02, list03) for x in l]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
6. 使用 heapq
heapq 是 Python 的一个标准模块,它提供了堆排序算法的实现。
该模块里有一个 merge 方法,可以用于合并多个列表,如下所示
>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>> list03 = [7,8,9]
>>>
>>> from heapq import merge
>>>
>>> list(merge(list01, list02, list03))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
要注意的是,heapq.merge 除了合并多个列表外,它还会将合并后的最终的列表进行排序。
>>> list01 = [2,5,3]
>>> list02 = [1,4,6]
>>> list03 = [7,9,8]
>>>
>>> from heapq import merge
>>>
>>> list(merge(list01, list02, list03))
[1, 2, 4, 5, 3, 6, 7, 9, 8]
>>>
它的效果等价于下面这行代码:
sorted(itertools.chain(*iterables))
如果你希望得到一个始终有序的列表,那请第一时间想到 heapq.merge,因为它采用堆排序,效率非常高。但若你不希望得到一个排过序的列表,就不要使用它了。
7. 借助魔法方法
利用魔法方法 __add__,实际 上当我们使用第一种方法 list01 + list02 的时候,内部实际上是作用在 __add__ 这个魔法方法上的.
所以以下两种方法其实是等价的
>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>>
>>> list01 + list02
[1, 2, 3, 4, 5, 6]
>>>
>>>
>>> list01.__add__(list02)
[1, 2, 3, 4, 5, 6]
>>>
借用这个魔法特性,我们可以 reduce 这个方法来对多个列表进行合并,示例代码如下
>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>> list03 = [7,8,9]
>>>
>>> from functools import reduce
>>> reduce(list.__add__, (list01, list02, list03))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
8. 使用 yield from
yield from 后可接一个可迭代对象,用于迭代并返回其中的每一个元素。
因此,我们可以像下面这样自定义一个合并列表的工具函数。
>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>> list03 = [7,8,9]
>>>
>>> def merge(*lists):
... for l in lists:
... yield from l
...
>>> list(merge(list01, list02, list03))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
看到这里,有没有涨姿势了,学了这么久的 Python ,没想到合并列表还有这么多的方法。本篇文章的主旨,并不在于让你全部掌握这 7 种合并列表的方法,实际上,你只要选用一种最顺手的方式即可。
但是在协同工作中,或者在阅读他人代码时,你不可避免地会碰到各式各样的写法,这时候你能下意识的知道这是在做合并列表的操作,那这篇文章就是有意义的。
来源:https://mp.weixin.qq.com/s?__biz=MzIzMzMzOTI3Nw
猜你喜欢
- 本文实例为大家分享了php微信公众号获取位置信息的具体代码,供大家参考,具体内容如下<?php/** * wechat php tes
- 我很想自己写一个这样的程序,不过wordpress是php的,我blog是ASP的,只好用ASP写代码了。经过一番折腾测试,终于让我的梦想变
- 这篇论坛文章(赛迪网技术社区)主要介绍了配置一个高可用性的MySQL服务器负载均衡群集的具体过程,详细内容请参考下文:本文将告诉你如何配置一
- 本文实例为大家分享了Python实现打砖块游戏的具体代码,供大家参考,具体内容如下#导入模块import pygamefrom pygame
- 1. 首先到 nodejs.org 下载 Node.js 安装包并安装。2. 打开 Sublime Text 2 编辑器。选择菜单 Tool
- Log包Go语言提供的默认日志包:https://golang.org/pkg/log/基本用法log包定义了Logger类型,该类型提供了
- 序言:php错误就是会使脚本运行不正常的情况。php的错误有很多种,包括warning、notice、deprecated、fetal er
- 什么是性能分析?性能分析是衡量应用程序在代码级别的相对性能。性能分析将捕捉的事件包括:CPU的使用,内存的使用,函数的调用时长和次数,以及调
- 一、XML产生的背景 XML同HTML一样,都来自Standard Generalized Markup Language, 即标准通用标记
- 今天在慕课网上学习了有关于python操作MySQL的相关知识,在此做些总结。python操作数据库还是相对比较简单的,由于python统一
- 同事在准备新老系统的切换,清空一个表的时候往往发现这个表的主键被另一个表用做外键,而系统里有太多层次的引用.所以清起来相当麻烦用下面这个脚本
- 为了防止某些别有用心的人从外部访问数据库,盗取数据库中的用户姓名、密码、信用卡号等其他重要信息,在我们创建数据库驱动的解决方案时,我们首先需
- *args与**kwarsg及闭包和装饰器过程先理解闭包,再理解装饰器,不要忘了不定长参数def func():
- JavaScript Length 字符长度函数,在很多时间我们会用length函数了,因为你得前台判断一个用户输入
- pLSA(probabilistic Latent Semantic Analysis),概率潜在语义分析模型,是1999年Hoffman提
- 本文由伯乐在线 - 敏捷翻译的史莉萍翻译自《Creating an Effective Color-Scheme for Web Desig
- 本文实例讲述了Python实现求解一元二次方程的方法。分享给大家供大家参考,具体如下:1. 引入math包2. 定义返回的对象3. 判断b*
- 需求如下: 1.模板页右边包含了一个登陆div,想让没登陆的时候这个div显示,登陆后该div隐藏 2.显示一个欢迎用户的div,主要是想通
- Python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供
- Windows操作系统支持Python的Python2版本和Python3版本,下载安装时要根据windows的操作系统来选择对应的Pyth