Хорошо, я попробовал. Итак, вы знаете первую часть:
part1 = itertools.product(LISTA, LISTB)
Что приводит к:
[('A1', 'B1_C'), ('A1', 'B2_D'), ('A2', 'B1_C'), ('A2', 'B2_D')]
Затем вы можете сгруппировать по последнему символу последнего элемента каждого кортежа:
keyfunc = lambda x: x[1][-1:]
grouped = itertools.groupby(sorted(part1, key=keyfunc), keyfunc)
# convert group object to dictionary
grouped_dict = dict((k, list(v)) for k, v in grouped)
Это дает вам следующее:
{'C': [('A1', 'B1_C'), ('A2', 'B1_C')], 'D': [('A1', 'B2_D'), ('A2', 'B2_D')]}
Теперь вы можете создать продукт для каждой группы и снова присоединиться к ним:
c = itertools.product(grouped_dict['C'], LISTC)
d = itertools.product(grouped_dict['D'], LISTD)
part2 = itertools.chain(c, d)
Что оставляет вам:
[(('A1', 'B1_C'), 'C1'),
(('A1', 'B1_C'), 'C2'),
(('A2', 'B1_C'), 'C1'),
(('A2', 'B1_C'), 'C2'),
(('A1', 'B2_D'), 'D1'),
(('A1', 'B2_D'), 'D2'),
(('A2', 'B2_D'), 'D1'),
(('A2', 'B2_D'), 'D2')]
Наконец, вы можете снова сгладить каждый элемент:
part2 = itertools.imap(lambda x: x[0] + (x[1],), part2)
Что дает вам окончательный результат:
[('A1', 'B1_C', 'C1'),
('A1', 'B1_C', 'C2'),
('A2', 'B1_C', 'C1'),
('A2', 'B1_C', 'C2'),
('A1', 'B2_D', 'D1'),
('A1', 'B2_D', 'D2'),
('A2', 'B2_D', 'D1'),
('A2', 'B2_D', 'D2')]
Вот код, если вы хотите поиграть с ним.
person
Blorgbeard
schedule
31.10.2017