combinations of list of lists using python

48 Views Asked by At

I am given an n-list-of-lists:

[
    [a,   b,  c],
    [p,   q,  r],
    ..,
    ..,
    [x,   y,  z]
]

I am supposed to create a result by choosing one element from each lists. For example, the result for the above example should look like:

[
    [a, p, .., x],
    [a, p, .., y],
    [a, p, .., z],
    ..
    ..
    [c, r, .., z]
]

How can I implement it without using n-nested for loops? I cannot use n-nested for loops because we do not know the size of input n-list-of-lists until runtime..

1

There are 1 best solutions below

0
Tim Roberts On BEST ANSWER

itertools.product was designed for this:

import itertools

data = [
    "abc",
    "jkl",
    "pqr",
    "xyz"
]

from pprint import pprint
pprint(list(itertools.product(*data)))

Output:

[('a', 'j', 'p', 'x'),
 ('a', 'j', 'p', 'y'),
 ('a', 'j', 'p', 'z'),
 ('a', 'j', 'q', 'x'),
 ('a', 'j', 'q', 'y'),
 ('a', 'j', 'q', 'z'),
 ('a', 'j', 'r', 'x'),
 ('a', 'j', 'r', 'y'),
 ('a', 'j', 'r', 'z'),
 ('a', 'k', 'p', 'x'),
 ('a', 'k', 'p', 'y'),
 ('a', 'k', 'p', 'z'),
 ('a', 'k', 'q', 'x'),
 ('a', 'k', 'q', 'y'),
 ('a', 'k', 'q', 'z'),
 ('a', 'k', 'r', 'x'),
 ('a', 'k', 'r', 'y'),
 ('a', 'k', 'r', 'z'),
 ('a', 'l', 'p', 'x'),
 ('a', 'l', 'p', 'y'),
 ('a', 'l', 'p', 'z'),
 ('a', 'l', 'q', 'x'),
 ('a', 'l', 'q', 'y'),
 ('a', 'l', 'q', 'z'),
 ('a', 'l', 'r', 'x'),
 ('a', 'l', 'r', 'y'),
 ('a', 'l', 'r', 'z'),
 ('b', 'j', 'p', 'x'),
 ('b', 'j', 'p', 'y'),
 ('b', 'j', 'p', 'z'),
 ('b', 'j', 'q', 'x'),
 ('b', 'j', 'q', 'y'),
 ('b', 'j', 'q', 'z'),
 ('b', 'j', 'r', 'x'),
 ('b', 'j', 'r', 'y'),
 ('b', 'j', 'r', 'z'),
 ('b', 'k', 'p', 'x'),
 ('b', 'k', 'p', 'y'),
 ('b', 'k', 'p', 'z'),
 ('b', 'k', 'q', 'x'),
 ('b', 'k', 'q', 'y'),
 ('b', 'k', 'q', 'z'),
 ('b', 'k', 'r', 'x'),
 ('b', 'k', 'r', 'y'),
 ('b', 'k', 'r', 'z'),
 ('b', 'l', 'p', 'x'),
 ('b', 'l', 'p', 'y'),
 ('b', 'l', 'p', 'z'),
 ('b', 'l', 'q', 'x'),
 ('b', 'l', 'q', 'y'),
 ('b', 'l', 'q', 'z'),
 ('b', 'l', 'r', 'x'),
 ('b', 'l', 'r', 'y'),
 ('b', 'l', 'r', 'z'),
 ('c', 'j', 'p', 'x'),
 ('c', 'j', 'p', 'y'),
 ('c', 'j', 'p', 'z'),
 ('c', 'j', 'q', 'x'),
 ('c', 'j', 'q', 'y'),
 ('c', 'j', 'q', 'z'),
 ('c', 'j', 'r', 'x'),
 ('c', 'j', 'r', 'y'),
 ('c', 'j', 'r', 'z'),
 ('c', 'k', 'p', 'x'),
 ('c', 'k', 'p', 'y'),
 ('c', 'k', 'p', 'z'),
 ('c', 'k', 'q', 'x'),
 ('c', 'k', 'q', 'y'),
 ('c', 'k', 'q', 'z'),
 ('c', 'k', 'r', 'x'),
 ('c', 'k', 'r', 'y'),
 ('c', 'k', 'r', 'z'),
 ('c', 'l', 'p', 'x'),
 ('c', 'l', 'p', 'y'),
 ('c', 'l', 'p', 'z'),
 ('c', 'l', 'q', 'x'),
 ('c', 'l', 'q', 'y'),
 ('c', 'l', 'q', 'z'),
 ('c', 'l', 'r', 'x'),
 ('c', 'l', 'r', 'y'),
 ('c', 'l', 'r', 'z')]