Как равномерно распределить один список в другой? - PullRequest
1 голос
/ 28 апреля 2020

Я хочу вставить более короткий список в более длинный, с равными интервалами. Например, учитывая

# existing list
main_list = ['lst1','lst2','lst3','lst4','lst5','lst6'] 

# aux list to be inserted to main list
aux_list = ['ax1','ax2','ax3'] 

Я хочу, чтобы вывод был

# desired output list
new_list = ['lst1','lst2','ax1','lst3','lst4','ax2','lst5','lst6','ax3'] 

Я пытался

new_list = [i[:2]+k for i,k in zip(main_list,aux_list)]

, но это не давало желаемого результата. ( РЕДАКТИРОВАНИЕ ДЛЯ ЯРКОСТИ )

Ответы [ 3 ]

2 голосов
/ 28 апреля 2020

Попробуйте использовать sum с zip:

print(sum(zip(main_list[::2], main_list[1::2], aux_list), ()))

Вывод:

('lst1', 'lst2', 'ax1', 'lst3', 'lst4', 'ax2', 'lst5', 'lst6', 'ax3')

Если вы хотите, чтобы результат был списком, используйте:

print(list(sum(zip(main_list[::2], main_list[1::2], aux_list), ())))

Вывод:

['lst1', 'lst2', 'ax1', 'lst3', 'lst4', 'ax2', 'lst5', 'lst6', 'ax3']

Редактировать:

Используйте это, если хотите, чтобы он работал для всех различных длин:

print(sum(zip(*[main_list[i::len(main_list) // len(aux_list)] for i in range(len(main_list) // len(aux_list))], aux_list), ()))

Выходные данные:

('lst1', 'lst2', 'ax1', 'lst3', 'lst4', 'ax2', 'lst5', 'lst6', 'ax3', 'lst7', 'lst8', 'ax4')

Опять же, если вы хотите, чтобы результат был списком, используйте:

print(list(sum(zip(*[main_list[i::len(main_list) // len(aux_list)] for i in range(len(main_list) // len(aux_list))], aux_list), ())))
2 голосов
/ 28 апреля 2020

Возможно, за этим проще следовать, и он масштабируется с различными размерами списка:

main_list = ['lst1','lst2','lst3','lst4','lst5','lst6'] 
aux_list = ['ax1','ax2','ax3'] 

# get subdivision sizes in main_list
m = len(main_list) // len(aux_list)

# create list of lists (in blocks)
z = [main_list[m*i:m*(i+1)] + [aux] for i,aux in enumerate(aux_list)]

# flatten
z = [k for sec in z for k in sec]

z
# ['lst1', 'lst2', 'ax1', 'lst3', 'lst4', 'ax2', 'lst5', 'lst6', 'ax3']

(обратите внимание, что это даст неожиданный вывод и / или разрыв, если ваши списки не делятся на размеры)

1 голос
/ 28 апреля 2020

Опираясь на ответ @ U10-Forward и обобщая его:

skip = len(main_list) // len(aux_list)
main_sub_lists = [main_list[i:i+skip] for i in range(0, len(main_list), skip)]
desired = sum([a_l + [b] for a_l, b in zip(main_sub_lists, aux_list)], [])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...