一、普通list合并
将两个或多个list合并,通常最常用的就是直接相加:
list1 = ["v1-1", "v1-2", "v1-3"]
list2 = ["v2-1", "v2-2", "v2-3"]
list3 = ["v3-1", "v3-2"]
tmp = list1 + list2 + list3
print(tmp)
相加的结果就是[list1的所有元素, list2的所有元素,list3的所有元素]:
[‘v1-1’, ‘v1-2’, ‘v1-3’, ‘v2-1’, ‘v2-2’, ‘v2-3’, ‘v3-1’, ‘v3-2’]
二、按照元素顺序合并
- 等长list合并
如果需要按照index逐个插入,也就是:
[‘v1-1’, ‘v2-1’, ‘v1-2’, ‘v2-2’, ‘v1-3’, ‘v2-3’]
上面这种方式是无法实现的,需要用到一个函数zip()
tmp = list(zip(list1, list2))
print(tmp)
merge1 = [t for v in tmp for t in v]
print(merge1)
上面这段代码的输出是
[(‘v1-1’, ‘v2-1’), (‘v1-2’, ‘v2-2’), (‘v1-3’, ‘v2-3’)]
[‘v1-1’, ‘v2-1’, ‘v1-2’, ‘v2-2’, ‘v1-3’, ‘v2-3’]
zip() 会先将list按照元素顺序变成tuple list,然后再将tuple list转成list就可以了
但是zip() 有一个问题是它是取最小的list的长度,如果将上面的代码改一下
tmp = list(zip(list1, list2, list3))
print(tmp)
merge1 = [t for v in tmp for t in v]
print(merge1)
结果如下
[(‘v1-1’, ‘v2-1’, ‘v3-1’), (‘v1-2’, ‘v2-2’, ‘v3-2’)]
[‘v1-1’, ‘v2-1’, ‘v3-1’, ‘v1-2’, ‘v2-2’, ‘v3-2’]
可以看到list1,list2的第3个元素并没有在里面,所以如果list长度不同并且需要保留较长list的所有元素的时候这种办法就不适用了
- 不等长list合并
也就是:
[‘v1-1’, ‘v2-1’, ‘v3-1’, ‘v1-2’, ‘v2-2’, 'v3-2, ‘v1-3’, ‘v2-3’]
需要用到itertools.chain(), 较短的list元素耗尽之后会用“None"补全tuple的元素
tmp = list(itertools.zip_longest(list1, list3))
print(tmp)
merge1 = [t for v in tmp for t in v if t is not None]
print(merge1)
结果是
[(‘v1-1’, ‘v3-1’), (‘v1-2’, ‘v3-2’), (‘v1-3’, None)]
[‘v1-1’, ‘v3-1’, ‘v1-2’, ‘v3-2’, ‘v1-3’]
- 合并dictionary的list值
dict = {"key1": ["v1-1", "v1-2", "v1-3"], "key2": ["v2-1", "v2-2", "v2-3"], "key3": ["v3-1", "v3-2"]}
tmp = list(itertools.zip_longest(*dict.values()))
print(tmp)
tmp = list(zip(*dict.values()))
print(tmp)
结果
[(‘v1-1’, ‘v2-1’, ‘v3-1’), (‘v1-2’, ‘v2-2’, ‘v3-2’), (‘v1-3’, ‘v2-3’, None)]
[(‘v1-1’, ‘v2-1’, ‘v3-1’), (‘v1-2’, ‘v2-2’, ‘v3-2’)]
三、将tuple list转成list
上面所用到的 zip(), itertools.chain() 都会先将list转成tuple list,所以最后如果需要元素list的话还需要再转一下,有三种办法可以将其转成list, merge1,2,3分别对应一种:
tmp = list(zip(list1, list2))
print(tmp)
merge1 = [t for v in tmp for t in v]
print(merge1)
merge2 = list(sum(tmp, ()))
print(merge2)
merge3 = list(itertools.chain(*tmp))
print(merge3)
tmp = list(itertools.zip_longest(list1, list2, list3))
print(tmp)
merge1 = [t for v in tmp for t in v if t is not None]
print(merge1)
merge2 = [v for v in sum(tmp, ()) if v is not None]
print(merge2)
merge3 = [v for v in itertools.chain(*tmp) if v is not None]
print(merge3)
结果如下
[(‘v1-1’, ‘v2-1’), (‘v1-2’, ‘v2-2’), (‘v1-3’, ‘v2-3’)]
[‘v1-1’, ‘v2-1’, ‘v1-2’, ‘v2-2’, ‘v1-3’, ‘v2-3’]
[‘v1-1’, ‘v2-1’, ‘v1-2’, ‘v2-2’, ‘v1-3’, ‘v2-3’]
[‘v1-1’, ‘v2-1’, ‘v1-2’, ‘v2-2’, ‘v1-3’, ‘v2-3’]
[(‘v1-1’, ‘v2-1’, ‘v3-1’), (‘v1-2’, ‘v2-2’, ‘v3-2’), (‘v1-3’, ‘v2-3’, None)]
[‘v1-1’, ‘v2-1’, ‘v3-1’, ‘v1-2’, ‘v2-2’, ‘v3-2’, ‘v1-3’, ‘v2-3’]
[‘v1-1’, ‘v2-1’, ‘v3-1’, ‘v1-2’, ‘v2-2’, ‘v3-2’, ‘v1-3’, ‘v2-3’]
[‘v1-1’, ‘v2-1’, ‘v3-1’, ‘v1-2’, ‘v2-2’, ‘v3-2’, ‘v1-3’, ‘v2-3’]