20

I have a variable number of user-defined lists, each containing words. For example, there may be three lists like the following:

list1 = ["THE", "A"]
list2 = ["ELEPHANT", "APPLE", "CAR"]
list3 = ["WALKED", "DROVE", "SAT"]

What I want is to iterate over every combination in each list, checking each against a dictionary of known words, to see which word-groupings are most like the dictionary. That means the iterations would be like:

[
    "THE ELEPHANT WALKED",
    "THE APPLE WALKED",
    "THE CAR WALKED",
    "THE ELEPHANT DROVE",
    "THE APPLE DROVE",
    "THE CAR DROVE",
    # ...
    "A CAR SAT",
]

The problem is that there can be any number of lists, and each list can contain a variable amount of items. I know that recursion could be used for this, but I need a solution without recursion. The problem I keep having is the fact that there can be a variable amount of lists, otherwise I would just write:

for a in list1:
    for b in list2:
        for c in list3:
            ...

But I won't know where to stop...

2 Answers 2

30

itertools.product does exactly what you want:

from itertools import product

lists = [
    ['THE', 'A'],
    ['ELEPHANT', 'APPLE', 'CAR'],
    ['WALKED', 'DROVE', 'SAT']
]

for items in product(*lists):
    print(items)
Sign up to request clarification or add additional context in comments.

5 Comments

Given he doesn't know the number of lists, product(*lists) might be more apt.
@Lattyware: Was doing that while you commented
I am curious as to how product is implemented. The only way I could think of to solve the problem was to use recursion. Does product use recursion itself?
This method only goes down one layer. Is there a way to go down an unknown level of embedded lists. So something like [[[[1,2,3],[4,5,6]],['Test','All']]]?
@rdt0086: Your comment isn't enough for me to understand your question - I recommend asking it as a new question rather than commenting on this answer, and showing precisely what behavior you want.
1

Using python 3.2

from itertools import product

[" ".join(i) for i in product(list1,list2,list3)]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.