这12种方法轻松合并Python中的列表
我喜欢12这个数字,因为有太多的事情与12有关。一年有12个月;古代用12个时辰(地支)表示一天的时间。用一纪表示12年;希腊有12主神;黄道有12宫;撒迦利亚.西琴先生的《地球编年史》中描述的第12个天体(尼比鲁);另外,朋友、爱人、恋人、家人的笔画都是12。 |
我喜欢12这个数字,因为有太多的事情与12有关。一年有12个月;古代用12个时辰(地支)表示一天的时间。用一纪表示12年;希腊有12主神;黄道有12宫;撒迦利亚.西琴先生的《地球编年史》中描述的第12个天体(尼比鲁);另外,朋友、爱人、恋人、家人的笔画都是12。所以12注定是一个令人难忘的数字,现在我再为12加一种难忘的解释:用12种方法合并Python列表。
其实Python语言合并两个或多个列表的方法非常简单,直接使用加号(+)即可。不过在很多场景下,并不太适合使用"+"。列表中的值由于某些原因是分散开的,或需要去重,或者正处于迭代中,所以本文将为读者展示如果用多达12种方法合并两个或多个列表。
方法1:宇宙第一加号大法这是最简单的合并Python列表的方法,代码如下:
list1 = [1, 2, 3] list2 = [4, 5, 6] result = list1 + list2 # [1, 2, 3, 4, 5, 6] print(result)
这个方法不用多解释,直接加就完了,既然加两个列表可以,加10000个列表当然也可以,或者放到循环里不断累加。
方法2:自动拆箱和装箱的星号大法
从Python 3.5开始,星号(*)就有了特殊的用途,将一个列表拆开,或将多个值组装成元组。如果将星号用作列表元素,并且这个列表元素也是一个列表的话,那么就会直接将列表中的值作为元素插入上一级的列表中,代码如下:
list1 = [1, 2, 3] list2 = [4, 5, 6] result = list1 + list2 # [1, 2, 3, 4, 5, 6] print(result)
PS:双星(**)可以拆装字典,如果将单星和双星作为函数的参数,那么就是装箱,可以将离散的值组装成元组(单星)和字典(双星),代码如下:
import itertools list1 = [1, 2, 3] list2 = [4, 5, 6] # 直接合并 # [1, 2, 3, 4, 5, 6] result = [item for item in itertools.chain(list1, list2)] print(result) # 合并两个列表的同时,每一个列表元素的值加1 # [2, 3, 4, 5, 6, 7] result = [item + 1 for item in itertools.chain(list1, list2)] print(result)
方法3:可控合并,舍“迭代”其谁
前面两种合并列表的方式固然比较简单,但问题是,只能做到简单的合并,如果要做更复杂的合并(如在合并的过程中加工特定的列表元素)就无法做到了。所以在这种情况下可以使用迭代的方式单独处理每一个列表元素,我称这种合并方式为可控合并,代码如下:
import itertools list1 = [1, 2, 3] list2 = [4, 5, 6] # 直接合并 # [1, 2, 3, 4, 5, 6] result = [item for item in itertools.chain(list1, list2)] print(result) # 合并两个列表的同时,每一个列表元素的值加1 # [2, 3, 4, 5, 6, 7] result = [item + 1 for item in itertools.chain(list1, list2)] print(result)
方法4:强行转换的用处
通过chain类,可以将两个或多个列表变成一个chain对象,然后再将chain对象转换为list对象,代码如下:
from itertools import chain list1 = [1, 2, 3] list2 = [4, 5, 6] result = list(chain(list1, list2)) # [1, 2, 3, 4, 5, 6] print(result)
chain类构造方法的原型如下:
def __init__(self, *iterables)
显而易见,构造方法的iterables参数使用了单星(*),所以可以接收任意多个列表参数,例如,chain(list1, list2, list3,list4,list5)是合法的,因此,本方法可以合并任意多个列表。
方法5:我不需要重复的值
有一种特殊的合并列表方式,就是去重,也就是说,如果合并的两个或多个列表中有重复的值,那么只保留一个相同的值即可。其实就是将合并后的结果变成集合,因此,可以用集合来解决这个问题,代码如下:
list1 = [1, 2, 3] list2 = [4, 3, 6] result = list(set(list1 + list2)) # [1, 2, 3, 4, 6] print(result)
这种合并列表的方式尽管使用了加号(+),但还使用set,所以应该属于一种新的合并方式,因为这种合并方式满足了特殊的需求:去重。
方法6:生成器大法
前面的几种方式都是使用了Python中的现成机制,现在来点复杂的:自定义转换函数。
这种合并列表的方式涉及到如下几种技术:
1. 自定义Python函数
2. 单星(*)作为函数参数
3. Python生成器(Generator)
4. 类型转换实现
代码如下:
list1 = [1, 2, 3] list2 = [4, 5, 6] list3 = [7, 8, 9] list4 = [10, 11, 12] list5 = ["hello", 20.1, True] # 合并函数,也是一个生成器 def merge(*iters): for it in iters: yield from it result = list(merge(list1, list2, 'abcd', [20, 21, 22],list3,list4,list5)) # [1, 2, 3, 4, 5, 6, 'a', 'b', 'c', 'd', 20, 21, 22, 7, 8, 9, 10, 11, 12, 'hello', 20.1, True] print(result)
这段代码的merge是一个生成器形式的合并函数,而且使用了单星(*)作为参数类型,所以可以传入任意多个列表。本例合并了7个列表。其中'abcd'是一个字符串形式的列表,每一个列表元素是单个字符。
方法7:又看到for in表达式了
Python简直将for做到了极致,提供了for in表达式。要注意,这是表达式,不是语句。所以可以用在其他表达式中,例如,用for in表达式生成一个列表,代码如下:
list1 = [1, 2, 3] list2 = [4, 5, 6] # 如果是字母,会输出对应的ASCII result = [ord(item) if str(item).isalpha() else item for item in (list1 + list2 + list('abcd') + [20, 21, 22])] # [1, 2, 3, 4, 5, 6, 97, 98, 99, 100, 20, 21, 22] print(result)
这种方式适合于复制一个新的列表,而且可以在合并的过程中修改特定的列表值。
方法8:自身也可以被修改
在合并列表时,如果希望一个列表本身被修改,那么可以用这种方法。例如,合并A和B两个列表后,A本身变成了最终的修改结果,也就是说,将B追加到A的后面。实现代码如下:
list1 = [1, 2, 3] list2 = [4, 5, 6] result = [] result.extend(list1) result.extend(list2) # [1, 2, 3, 4, 5, 6] print(result) # [1, 2, 3, 4, 5, 6] list1.extend(list2) print(list1)
如果希望不修改参与合并的列表,那么可以定义一个空的列表。
方法9:Python函数库是个好东西,到处都是宝藏
Python有一个非常庞大的函数库,其中不乏用于合并列表的函数,其中operator模块中的add函数就是其中之一,其实add内部使用了加号(+)合并列表,不过这也应该算是一种方法,因为以后add函数可能会使用其他的方式合并列表。代码如下:
import operator list1 = [1, 2, 3] list2 = [4, 5, 6] result = operator.add(list1, list2) # [1, 2, 3, 4, 5, 6] print(result)
方法10:远在天边,近在眼前
前面介绍了一堆用于合并列表的API,其实列表类(list)本身就有一个__add__方法,用于合并两个列表,代码如下:
list1 = [1,2,3] list2 = [4,5,6] result = list.__add__(list1, list2) # [1, 2, 3, 4, 5, 6] print(result)
方法11:传统方式
来个最传统的方式介绍了这么多合并列表的方式,其实最传统的还是一个元素一个元素添加,也就是列表的append方法。那么可能很多同学要问,有这么多好的方式,为啥要一个元素一个元素添加呢?岂不是影响效率?其实这也要看情况。例如,在一些场景,列表的值已经被拆开了(为了处理其他的业务),那么就顺道使用append方法挨个添加了,反正已经被拆开了,不加白不加。
实现代码如下:
list1 = [1,2,3] list2 = [4,5,6] result = [] for elem in list1: result.append(elem) for elem in list2: result.append(elem) # [1, 2, 3, 4, 5, 6] print(result)
方法12:合并方式不够,外援来凑
其实Python中合并列表的方式也就这么多,好像只有11种,前面都说了,有12种,为了凑够12种,这里请了一个外援,这就是NumPy,这个库主要用于科学计算,对数据的处理比较强大,用NumPy合并Python列表的代码如下:
import numpy list1 = [1,2,3] list2 = [4,5,6] result = numpy.concatenate([list1,list2]).tolist() print(result)
由于numpy.concatenate函数返回了numpy.ndarray类型,所以要得到Python列表对象,还需要使用tolist方法进行转换。NumPy是第三方库,所以需要使用下面的命令进行安装。
pip install numpy
这12种方法轻松合并Python中的列表相关推荐
- linux列表中添加多个元素,这12种方法轻松合并Python中的列表
导读 我喜欢12这个数字,因为有太多的事情与12有关.一年有12个月;古代用12个时辰(地支)表示一天的时间.用一纪表示12年;希腊有12主神;黄道有12宫;撒迦利亚.西琴先生的<地球编年史&g ...
- python语言中的多行注释符是_有没有一种方法可以在Python中创建多行注释? - python...
我最近开始研究Python,但是找不到如何实现多行注释.大多数语言都有块注释符号,例如 /* */ 我在Python中尝试过此方法,但它引发了错误,因此这可能不是正确的方法. Python实际上是否具 ...
- 怎么把视频合并到一起?这几种方法轻松合并视频
怎么把视频合并到一起呢?随着智能手机的普及以及拍摄技术的日益完善,大家出门在外会随手使用手机来拍摄视频,在视频编辑过程中,将多个视频文件合并为一个视频文件可以使观看过程更加顺畅,可以产生一个不错的观看 ...
- python中列表长度查询,从零开始学Python|如何在Python中查找列表的长度?
Python中的列表是有序且可更改的集合数据类型.列表也可以有重复的条目.所述的PythonLEN()方法被用于找到任何对象的长度.在本文中,我们将按以下顺序学习如何在python中查找列表的长度: ...
- 多个PDF文件如何合并成一个?两种方法轻松get
在日常学习生活中,如果你需要将多个文档整合为一个完整的文件,比如说多篇文章.多张图片.多个表格等等,这时候就需要将这些文档合并成一个PDF文件.如何将多个PDF文件如何合并成一个?两种方法轻松帮你搞定 ...
- python从键盘输入一个列表计算输出元素的平均值_python列表查找值_在Python中查找列表平均值的5种方法...
python列表查找值 Hi Folks! In this article, we will have a look at the various ways to find the average o ...
- php处理emoji表情方法,PHP实战:3种方法轻松处理php开发中emoji表情的问题
<PHP实战:3种方法轻松处理php开发中emoji表情的问题>要点: 本文介绍了PHP实战:3种方法轻松处理php开发中emoji表情的问题,希望对您有用.如果有疑问,可以联系我们. 背 ...
- python3 列表长度_3种在Python中查找列表长度的简便方法
python3 列表长度 In this article, we will be unveiling techniques to find the length of a Python list. F ...
- attrib批量显示文件夹_电脑中病毒,文件夹全部变成快捷方式?3种方法轻松解决!...
原标题:电脑中病毒,文件夹全部变成快捷方式?3种方法轻松解决! 最近有位朋友去打印店的时候,u盘一不小心就带回了1KB快捷方式病毒,导致电脑u盘里的文件以及文件夹全部变成了快捷方式,不知道如何解决. ...
最新文章
- jquery学习(3)--高级选择器
- 用于面包板的双列直插需要多宽?
- PAT (Basic Level) Practice (中文)1023 组个最小数 (20 分) (排序)
- Cmder - 在右键菜单添加Cmder Here
- 如何禁用win7的ASLR
- 阿里、华为、美团,大厂面试算法题,这些你会吗?
- 网络编程基础【林老师版】:简单的 套接字通信(一)
- Directory monitor
- php pdo-insert,php mysql pdo insert multiple rows 批量插入
- 蓝桥杯2021年第十二届C++省赛第三题-直线
- Java三种连接池(druid、c3p0、dbcp)
- JQuery Mobile Popup窗口定位
- 2022年危险化学品经营单位安全管理人员考试练习题及答案
- napa与matlab,纳帕谷产区Napa Valley|酒斛网 - 与数十万葡萄酒爱好者一起发现美酒,分享微醺的乐趣...
- cluster by、group by操作
- 三维坐标变换——旋转矩阵与旋转向量
- Minimal Area
- 信息类专业国际会议/期刊影响因子汇总
- java的对象存储在哪里?
- xmind8使用甘特图与导出甘特图PDF