Это сработало бы, выдав 436 комбинаций:
import itertools as itls
colors = ["blue", "yellow", "green", "black", "magenta"]
numbers = [1,2,3,4,5,6,7,8]
material = ["beton", "wood", "stone"]
names = ["Susi", "Klara", "Claire", "Moni"]
my_lists = [colors, numbers, material, names]
my_combos = [(x,y,z) for (lst_1,lst_2,lst_3) in itls.combinations(my_lists,3)
for (x,y,z) in itls.product(lst_1, lst_2, lst_3) ]
# print (my_combos)
print (len(my_combos))
Объяснение:
Требуемый результат создается в виде списка и присваивается my_combos
.
Список строится с использованием понимания списка с вложенной двойной итерацией.
В двойной вложенной итерации:
- Внешний цикл for
for (lst_1,lst_2,lst_3) in itls.combinations(my_lists,3)
повторяетсядля всех возможных комбинаций списков, принимая 3 списка одновременно. - Внутренний цикл for
for (x,y,z) in itls.product(lst_1, lst_2, lst_3)
выполняет итерацию по декартовому произведению lst_1
, lst_2
и lst_3
(эти lst_1
, lst_2
и lst_3
определяются для каждой итерации внешнего цикла for)
Код для проверки отсутствия дубликатов в результате:
# Code to verify that there are no duplicates.
from collections import Counter
for x, count_x in counts.items():
if (count_x > 1): # if duplicate
print ("Duplicate item ({}) occurs {} times".format(x, count_x))