Как объединить список, но сохранить предыдущий порядок списков? - PullRequest
2 голосов
/ 12 июня 2019

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

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

1 голос
/ 12 июня 2019

Используйте встроенный 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 по умолчанию zip короче итеративный(s) с None.Вы можете установить любое значение по умолчанию, используя fillvalue из zip_longest.

1 голос
/ 12 июня 2019

Другие предложения хороши, если у вас одинаковая длина list s (zip) или вы не против значения заполнителя в результате (zip_longest).

Но логично, что выздесь запрашивается круговая обработка входов, а не архивирование.Сглаживая, вы теряете парный аспект zip и можете укусить его за входы неравной длины.

Более общее решение этой проблемы доступно с модулем itertoolsroundrobin recipe (нажмите на ссылку для кода, я просто включаю здесь использование):

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

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

0 голосов
/ 12 июня 2019

Вы можете использовать комбинацию списочных представлений и 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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...