import itertools
[[(y if selector else x) for (selector, x, y) in zip(lidxs, list1, list2)]
for lidxs in itertools.product([0, 1], repeat=4)]
[['a', 'b', 'c', 'd'],
['a', 'b', 'c', 'D'],
['a', 'b', 'C', 'd'],
...
['A', 'B', 'c', 'D'],
['A', 'B', 'C', 'd'],
['A', 'B', 'C', 'D']]
Auch:
[[[list1, list2][lidx][i] for (i, lidx) in enumerate(lidxs)]
for lidxs in itertools.product([0, 1], repeat=4)]]
Ersetzen Sie [...] durch (...), um einen trägen Generator zu erhalten. Wenn Sie die (etwas) ausführlichere Ausbeute anstelle von Einzeilern bevorzugen, kann sie leicht umgewandelt werden. Zum Beispiel das zweite Beispiel, verallgemeinert:
def generate_sublists(*lsts):
for lidxs in itertools.product(range(len(lsts)), repeat=len(lsts[0])):
yield [lsts[lidx][i] for (i, lidx) in enumerate(lidxs)]