阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

这12种方法轻松合并Python中的列表

80次阅读
没有评论

共计 4238 个字符,预计需要花费 11 分钟才能阅读完成。

导读 我喜欢 12 这个数字,因为有太多的事情与 12 有关。一年有 12 个月; 古代用 12 个时辰 (地支) 表示一天的时间。用一纪表示 12 年; 希腊有 12 主神; 黄道有 12 宫; 撒迦利亚. 西琴先生的《地球编年史》中描述的第 12 个天体(尼比鲁); 另外,朋友、爱人、恋人、家人的笔画都是 12。

这 12 种方法轻松合并 Python 中的列表

我喜欢 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

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计4238字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中