У меня есть этот список после объединения с использованием приведенного ниже, что дает мне этот вывод.
['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']
@ Пол прав. Выходные списки неверны для заданных входных списков
Возможно, используйте более простой пример со списками, такими как ['a', 'b', ...].






Вы можете использовать комбинацию списков и 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']
Примечание. itertoolschain.from_iterable существует для оптимизации таких случаев использования (и позволяет использовать некоторые оптимизации CPython zip, которые list понимание не может использовать): list(chain.from_iterable(zip(data1, data2, data3))).
Используйте встроенный 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.
Другие предложения подходят, если у вас одинаковая длина lists (zip) или вы не возражаете против значений наполнителя в результате (zip_longest).
Но логически то, что вы просите здесь, - это циклический перебор входных данных, а не застежка-молния. Сглаживая, вы теряете парный аспект zip и можете быть укушены им за ввод неравномерной длины.
Более общее решение этой проблемы доступно с рецепт itertools модуля roundrobin (щелкните ссылку для получения кода, я просто включаю здесь использование):
joinlist = list(roundrobin(data1, data2, data3))
Это берет элемент из каждого из входов по порядку; если один вход короче других, он исключается из более поздних раундов без ввода значений заполнителя мусора или потери значений из более длинных входных данных.
Можем ли мы предположить, что все списки всегда имеют одинаковый размер?