[Tutor] Need help combining elements of a list of lists

Steven D'Aprano steve at pearwood.info
Tue Jul 10 23:09:39 EDT 2018


On Tue, Jul 10, 2018 at 09:46:57PM -0500, Jim wrote:

> Say I have a list like ltrs and I want to print out all the possible 3 
> letter combinations. I want to combine letters from each inner list but 
> not combine any letters within the inner list itself. So ACF and ADF 
> would be ok but ABC would not.
> 
> I can lay it out manually and see the pattern, I cannot figure out how 
> to do it programically. Just in case this looks like homework it is not. 
> It's a small test case I devised to try to figure it out so I can apply 
> it to a bigger real world problem I am working on.
> 
> ltrs = [['A', 'B'], ['C', 'D', 'E'], ['F', 'G', 'H', 'I']]

If you know that there are just three sublists, then you can do this:

for a in ltrs[0]:
    for b in ltrs[1]:
        for c in ltrs[2]:
            print(a + b + c)

I trust that's easy enough to understand.

But here's a more general technique, where you don't need to know up 
front how many nested lists there are:


from itertools import product  # short for "Cartesian Product"
for s in product(*ltrs):
    print(''.join(s))


The *ltrs syntax might be a bit mysterious: it is called "sequence 
unpacking", and tells the interpreter to use each item from ltrs as a 
separate argument:

product(*ltrs)
=> product(ltrs[0], ltrs[1], ltrs[2])


-- 
Steve


More information about the Tutor mailing list