其实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)