使用以下方法合并后,我有了此列表。
['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']
答案 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']