我喜欢数字12,因为关于12的东西太多了。一年有12个月;在古代,12小时(地支)被用来表示一天的时间。用一个纪元代表12年;希腊有12位主神;生肖有12宫;ZachariasSitchin先生在《地球编年史》中描述的第12天体(Nibiru);另外,朋友,恋人,恋人,家人的笔画都是12。所以12注定是一个难忘的数字,现在我为12补充一个难忘的解释:用12种方法合并Python列表。其实Python语言中合并两个或多个列表的方法很简单,直接使用加号(+)即可。但是,在很多场景下,并不适合使用“+”。列表中的值由于某种原因比较分散,或者需要去重,或者正在迭代,所以本文将向读者展示如何用最多12种方法合并两个或多个列表。方法一:宇宙第一加法这是最简单的Python列表合并方法,代码如下:list1=[1,2,3]list2=[4,5,6]result=list1+list2#[1,2,3,4,5,6]print(result)这个方法不用多解释,直接加就行了。既然可以添加两个列表,那么添加10000个列表也是可以的,也可以循环不断地添加。方法二:自动拆箱装箱的星号方法从Python3.5开始,星号(*)就有了一个特殊的用途,可以解包一个列表或者将多个值组装成一个元组。如果使用星号作为列表元素,并且列表元素也是列表,那么列表中的值会直接作为元素插入到上层列表中,代码如下:list1=[1,2,3]list2=[4,5,6]result=list1+list2#[1,2,3,4,5,6]print(result)PS:双星(**)可以拆字典,如果singlestar和doublestar作为函数的参数进行装箱,可以将离散值组装成元组(单星)和字典(双星)。代码如下:importitertoolslist1=[1,2,3]list2=[4,5,6]#直接合并#[1,2,3,4,5,6]result=[itemforiteminitertools.chain(list1,list2)]print(result)#合并两个列表时,将每个列表元素的值加1#[2,3,4,5,6,7]result=[item+1foriteminitertools.chain(list1,list2)]print(result)方法三:可控合并,放弃“迭代”等两种合并列表的方式虽然比较简单,但问题是只能做简单的合并,比较复杂的合并(比如处理特定的列表合并过程中的元素)无法完成。所以在这种情况下,你可以使用迭代来分别处理每个列表元素。我将此合并方法称为受控合并。代码如下:importitertoolslist1=[1,2,3]list2=[4,5,6]#DirectMerge#[1,2,3,4,5,6]result=[itemforiteminitertools.chain(list1,list2)]print(result)#合并两个列表时,将每个列表元素的值加1#[2,3,4,5,6,7]result=[item+1foriteminitertools.chain(list1,list2)]print(result)方法四:强制转换的用处通过chain类,可以将两个或多个list组合成一个chain对象,然后将chain对象转换成一个list对象,代码如下:fromitertoolsimportchainlist1=[1,2,3]list2=[4,5,6]result=list(chain(list1,list2))#[1,2,3,4,5,6]print(result)链类构造原型方法如下:def__init__(self,*iterables)显然,构造方法的iterables参数使用的是单星号(*),所以它可以接收任意多个列表参数,例如chain(list1,list2,list3,list4,list5)是合法的,所以这个方法可以组合任意数量的列表。方法5:我不需要重复值。合并列表有一种特殊的方式,就是去重。即如果合并后的两个或多个列表中存在重复值,则只保留一个相同的值。其实就是把合并后的结果变成一个集合。因此,可以使用set来解决这个问题。代码如下:list1=[1,2,3]list2=[4,3,6]result=list(set(list1+list2))#[1,2,3,4,6]print(result)合并列表的方式虽然使用了加号(+),但是也使用了set,??所以应该属于一种新的合并方式,因为这种合并方式满足了一个特殊的需求:去重。方法六:生成器大法前面的方法都是使用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]#合并函数也是生成器defmerge(*iters):foritiniters:yieldfromitresult=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”是一个字符串列表,每个列表元素都是一个字符。方法七:又看到了forin表达式。Python简单地将for发挥到极致,并提供forin表达式。请注意,这是一个表达式,而不是一个语句。所以可以用在其他表达式中,比如用forin表达式生成列表,代码如下:list1=[1,2,3]list2=[4,5,6]#如果是一个字母,就会输出对应的ASCIIresult=[ord(item)ifstr(item).isalpha()elseitemforitemin(list1+list2+list('abcd')+[20,21,22])]#[1,2,3,4,5,6,97,98,99,100,20,21,22]print(result)该方法适用于复制一个新的列表,在合并的过程中可以修改具体的列表值。方法八:也可以修改自身在合并列表的时候,如果你想修改一个列表本身,可以使用这个方法。例如合并两个列表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)如果不想修改参与合并的列表,可以定义一个空列表。方法九:Python函数库是个好东??西,到处都是宝藏。Python有一个非常庞大的函数库,合并列表的函数有很多。其中,operator模块中的add函数就是其中之一。实际上add在内部使用add。符号(+)合并列表,但这也应该算是一种方法,因为add函数以后可能会使用其他方法来合并列表。代码如下:importoperatorlist1=[1,2,3]list2=[4,5,6]result=operator.add(list1,list2)#[1,2,3,4,5,6]print(结果)方法10:远在天上,近在眼前。前面介绍了一堆用于合并列表的API。事实上,列表类(list)本身有一个__add__方法用于合并两个列表。代码如下:list1=[1,2,3]list2=[4,5,6]result=list.__add__(list1,list2)#[1,2,3,4,5,6]print(结果)方法11:来到最传统的方法介绍了这么多合并列表的方法。其实最传统的方式就是逐个添加元素,也就是列表的append方法。那么很多同学可能会问,那么好的方法那么多,为什么要一次加一个元素呢?不影响效率吗?其实也要看情况。比如有些场景下,list的值已经被拆装了(为了处理其他业务),然后用append方法一个一个添加,反正已经被拆装了,没白没加.实现代码如下:list1=[1,2,3]list2=[4,5,6]result=[]foreleminlist1:result.append(elem)foreleminlist2:result.append(elem)#[1,2,3,4,5,6]print(result)方法12:合并的方式不够用,外援来补。事实上,在Python中合并列表的方法只有这么多。好像只有11种。如前所述,有12种。为了补12种,这里来个外援,这个就是NumPy,这个库主要用于科学计算,对数据的处理比较强大,用NumPy合并Python列表的代码如下:importnumpylist1=[1,2,3]list2=[4,5,6]result=numpy.concatenate([list1,list2]).tolist()print(result)由于numpy.concatenate函数返回的是numpy.ndarray类型,所以得到Python列表对象,还需要使用tolist方法进行转换。NumPy是第三方库,所以需要使用如下命令安装。pip安装numpy
