Search code examples
pythonrecursioncombinationsdepth-first-search

combinations of list of lists using python


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..


Solution

  • 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')]