Как вывести перебор элементов максимально разным и НЕ по порядку?
Имеется 3 списка. Надо их перебрать с максимальным отличием. Я пробовал отсортировать по количеству элементов и потом перемножить, но повторение с предыдущим все равно получается:
from itertools import product
the_list = [[111, 182], [264,4, 271], [48, 98, 104, 134, 141, 143, 180, 213, 225, 244, 278]]
the_list = sorted(the_list, key=len, reverse=True)
for i in list(product(*the_list)):
print(i)
Как перебрать их с максимальным отличием (чтобы не for-перебор был)? Очередность примерного перебора на картинке показал.
!Дополнение:
- рандомность не нужна
- Я нашел закономерноть!!! Во-общем, тут такая схема: нужно брать каждые
len(lstK1)*len(lstK2)*..*len(lstKN-1) + len(lstKN-1)+1, если len(lstN)>1. Причем итераций будет столько, сколько комбинаций!
Теперь вопрос. Есть такая библиотека, которая делает копию списка в таком порядке?
Ответы (1 шт):
Автор решения: GrAnd
→ Ссылка
Если длины подсписков не кратны, то, как мне кажется, подойдёт вот такой вариант.
# from math import prod # Python 3.8+
from numpy import prod
the_list = [[111, 182], [264,4, 271], [48, 98, 104, 134, 141, 143, 180, 213, 225, 244, 278]]
prod_lengths = prod(list(map(len, the_list)))
result = list(zip(*(x*(prod_lengths//len(x)) for x in the_list)))
Или через генератор, чтобы не занимать память размножением списков.
def get_combination(*args):
for i in range(prod(list(map(len, the_list)))):
yield tuple(lst[i%len(lst)] for lst in args)
result = list(get_combination(*the_list))
