Python按照元素顺序合并list

一、普通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’]

二、按照元素顺序合并

  1. 等长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的所有元素的时候这种办法就不适用了

  1. 不等长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’]

  1. 合并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’]

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值