Как объединить список, но сохранить предыдущий порядок списков?

У меня есть этот список после объединения с использованием приведенного ниже, что дает мне этот вывод.

['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']

Можем ли мы предположить, что все списки всегда имеют одинаковый размер?

DSC 12.06.2019 02:53

@ Пол прав. Выходные списки неверны для заданных входных списков

DSC 12.06.2019 02:55

Возможно, используйте более простой пример со списками, такими как ['a', 'b', ...].

Michael Butscher 12.06.2019 02:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
60
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать комбинацию списков и 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))).

ShadowRanger 12.06.2019 03:15

Используйте встроенный 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))

Это берет элемент из каждого из входов по порядку; если один вход короче других, он исключается из более поздних раундов без ввода значений заполнителя мусора или потери значений из более длинных входных данных.

Другие вопросы по теме