如何合并列表,但保持先前的列表顺序?

时间:2019-06-12 00:50:32

标签: python list merge

使用以下方法合并后,我有了此列表。

['description t2_HELP', 'description t2_1507', 'description t2_1189', 'description t2_5625', 'description None', 'description None', 'description None', 'description None', 'interface Gi3/0/13', 'interface Gi3/0/7', 'interface Gi1/0/11', 'interface Gi3/0/41']

但是,我希望在合并数据时保持该数据的顺序。因此示例列表集将如下所示。

['interface Gi3/0/25','description None','description t2_2696','interface Gi1/0/29','description None','description t2_4148','interface Gi1/0/31','description None','description t2_4212','interface Gi2/0/31','description None','description t2_4271']

这是我合并列表的方式,

joinlist = data1 + data2 + data3

列表看起来像这样

data1 = ['interface Gi3/0/25','interface Gi1/0/29','interface Gi1/0/31','interface Gi2/0/31']
data2 = ['description None','description None','description None','description None']
data3 = ['description t2_2696','description t2_4148','description t2_4212','description t2_4271']

3 个答案:

答案 0 :(得分:1)

如果没问题,可以使用内置的zip来截断列表:

joinlist = []
for d in zip(data1,data2,data3):
    joinlist.extend(d)

输出:

['interface Gi3/0/25',
 'description None',
 'description t2_2696',
 'interface Gi1/0/29',
 'description None',
 'description t2_4148',
 'interface Gi1/0/31',
 'description None',
 'description t2_4212',
 'interface Gi2/0/31',
 'description None',
 'description t2_4271']

如果要避免截断,请使用itertools.zip_longest

data2.append('test_me') # For testing purpose
joinlist = []
for d in zip_longest(data1,data2,data3):
    joinlist.extend(d)

输出:

['interface Gi3/0/25',
 'description None',
 'description t2_2696',
 'interface Gi1/0/29',
 'description None',
 'description t2_4148',
 'interface Gi1/0/31',
 'description None',
 'description t2_4212',
 'interface Gi2/0/31',
 'description None',
 'description t2_4271',
 None,
 'a',
 None]

注意:None末尾的joinlist是因为zip_longest默认情况下会用None压缩较短的可迭代项。您可以使用fillvalue中的zip_longest设置任何默认值。

答案 1 :(得分:1)

如果您有相等的长度list s(zip),或者不介意在结果中填充值(zip_longest),其他建议也很好。

但是在逻辑上,您要的是输入的循环,而不是压缩。通过展平,您会失去zip的配对方面,并且可能因长度不均匀的输入而被其咬住。

the itertools module's roundrobin recipe提供了针对此问题的更通用解决方案(单击代码链接,我仅在此处包括用法):

joinlist = list(roundrobin(data1, data2, data3))

按顺序从每个输入中获取一个元素;如果一个输入比其他输入短,则在以后的回合中将其忽略,而不会注入垃圾填充值或从较长的输入中丢失值。

答案 2 :(得分:0)

您可以结合使用列表理解和zip

>>> [i for t in zip(data1, data2, data3) for i in t]
['interface Gi3/0/25', 'description None', 'description t2_2696', 'interface Gi1/0/29', 'description None', 'description t2_4148', 'interface Gi1/0/31', 'description None', 'description t2_4212', 'interface Gi2/0/31', 'description None', 'description t2_4271']