Sequential nested list with string concatenation
This is what's known as a Cartesian product. Here's an approach using itertools.product
:
import itertools as it
list("/".join(p) for p in it.product(*l))
Output:
['a/d/e', 'a/d/f', 'b/d/e', 'b/d/f', 'c/d/e', 'c/d/f']
The itertools.product
function takes an arbitrary number of iterables as arguments (and an optional repeat
parameter). What I'm doing with *l
is unpacking your sublists as separate arguments to the itertools.product
function. This is essentially what it sees:
it.product(["a", "b", "c"], ["d"], ["e", "f"])
PS - you could actually use strings as well, since strings are iterable:
In [6]: list(it.product("abc", "d", "ef"))
Out[6]:
[('a', 'd', 'e'),
('a', 'd', 'f'),
('b', 'd', 'e'),
('b', 'd', 'f'),
('c', 'd', 'e'),
('c', 'd', 'f')]
Beware that the size of the Cartesian product of collections A
, B
, etc is the product of the sizes of each collection. For example, the Cartesian product of (0, 1)
, ("a", "b", "c")
would be 2x3=6. Adding a third collection, (5, 6, 7, 8)
bumps the size up to 24.
You need to unpack the sublists and use itertools.product
:
from itertools import product
out = ['/'.join(tpl) for tpl in product(*l)]
Output:
['a/d/e', 'a/d/f', 'b/d/e', 'b/d/f', 'c/d/e', 'c/d/f']