Вы можете использовать словарь с itertools.combinations
:
from itertools import combinations, chain
L = [['a', ['a1', 'a2', 'a3']], ['b', ['b1', 'b2', 'b3']], ['c', ['c1', 'c2', 'c3']]]
d = dict(L)
res = {comb: list(chain.from_iterable(map(d.__getitem__, comb))) \
for comb in combinations(d, 2)}
Результат:
{('a', 'b'): ['a1', 'a2', 'a3', 'b1', 'b2', 'b3'],
('a', 'c'): ['a1', 'a2', 'a3', 'c1', 'c2', 'c3'],
('b', 'c'): ['b1', 'b2', 'b3', 'c1', 'c2', 'c3']}
Или, если вы предпочитаете вложенные списки:
res_lst = [[list(comb), list(chain.from_iterable(map(d.__getitem__, comb)))] \
for comb in combinations(d, 2)]
# [[['a', 'b'], ['a1', 'a2', 'a3', 'b1', 'b2', 'b3']],
# [['a', 'c'], ['a1', 'a2', 'a3', 'c1', 'c2', 'c3']],
# [['b', 'c'], ['b1', 'b2', 'b3', 'c1', 'c2', 'c3']]]
Идея в обоих случаях состоит в том, чтобы уменьшить количество циклов for
уровня Python.