Finding all unique combinations of two sets of identical lists?

Viewed 105

I have two sets of identical lists and another list that I'm trying to find all unique combinations of. I'm having a hard time figuring out away to get these combinations without repeating the items in the same line (ex: bacon, bacon).

My lists:

crust = ['Thin Crust', 'Hand Tossed']
topping1 = ['Bacon', 'Pepperoni', 'Steak']
topping2 = ['Bacon', 'Pepperoni', 'Steak']
sauce1 = ['Tomato', 'BBQ', 'Ranch']
sauce2 = ['Tomato', 'BBQ', 'Ranch']

I'm trying to get an output that lists all unique combinations in the following order: Crust|Topping 1|Topping 2|Sauce 1|Sauce 2 Ex:

Thin Crust, Bacon, Pepperoni, Tomato, BBQ
Thin Crust, Bacon, Pepperoni, Tomato, Ranch
Thin Crust, Bacon, Pepperoni, BBQ, Ranch
....

Attempt:

import itertools

crust = ['Thin Crust', 'Hand Tossed']
topping1 = ['Bacon', 'Pepperoni', 'Steak']
topping2 = ['Bacon', 'Pepperoni', 'Steak']
sauce1 = ['Tomato', 'BBQ', 'Ranch']
sauce2 = ['Tomato', 'BBQ', 'Ranch']

test = list(itertools.product(crust,topping1,topping2,sauce1,sauce2))
print(test)

My first thought of attacking this was using itertools, but I don't know how to prevent duplicates in the same line like mentioned above. Any ideas on how to go about this?

4 Answers

If I understand correctly, what you're really looking for is each 2-item combination of toppings and sauces individually, then their product with crust. If so, you don't need identical lists.

from itertools import combinations, product

crust = ['Thin Crust', 'Hand Tossed']
topping = ['Bacon', 'Pepperoni', 'Steak']
sauce = ['Tomato', 'BBQ', 'Ranch']

topping_combs = combinations(topping, r=2)
sauce_combs = combinations(sauce, r=2)

# >> FOR DEMO
topping_combs = list(topping_combs)
sauce_combs = list(sauce_combs)
print(topping_combs)
print(sauce_combs)
print()
# << FOR DEMO

prod = product(crust, topping_combs, sauce_combs)
for c, t, s in prod:
    print(c, *t, *s, sep=', ')

Output:

[('Bacon', 'Pepperoni'), ('Bacon', 'Steak'), ('Pepperoni', 'Steak')]
[('Tomato', 'BBQ'), ('Tomato', 'Ranch'), ('BBQ', 'Ranch')]

Thin Crust, Bacon, Pepperoni, Tomato, BBQ
Thin Crust, Bacon, Pepperoni, Tomato, Ranch
Thin Crust, Bacon, Pepperoni, BBQ, Ranch
Thin Crust, Bacon, Steak, Tomato, BBQ
Thin Crust, Bacon, Steak, Tomato, Ranch
Thin Crust, Bacon, Steak, BBQ, Ranch
Thin Crust, Pepperoni, Steak, Tomato, BBQ
Thin Crust, Pepperoni, Steak, Tomato, Ranch
Thin Crust, Pepperoni, Steak, BBQ, Ranch
Hand Tossed, Bacon, Pepperoni, Tomato, BBQ
Hand Tossed, Bacon, Pepperoni, Tomato, Ranch
Hand Tossed, Bacon, Pepperoni, BBQ, Ranch
Hand Tossed, Bacon, Steak, Tomato, BBQ
Hand Tossed, Bacon, Steak, Tomato, Ranch
Hand Tossed, Bacon, Steak, BBQ, Ranch
Hand Tossed, Pepperoni, Steak, Tomato, BBQ
Hand Tossed, Pepperoni, Steak, Tomato, Ranch
Hand Tossed, Pepperoni, Steak, BBQ, Ranch

You can use a recursive generator function:

def combos(d, c = []):
  if not d:
     yield c
  else:
     for i in filter(lambda x:x not in c, d[0]):
        yield from combos(d[1:], c+[i])

print(list(combos([crust,topping1,topping2,sauce1,sauce2])))

Output:

[['Thin Crust', 'Bacon', 'Pepperoni', 'Tomato', 'BBQ'], ['Thin Crust', 'Bacon', 'Pepperoni', 'Tomato', 'Ranch'], ['Thin Crust', 'Bacon', 'Pepperoni', 'BBQ', 'Tomato'], ['Thin Crust', 'Bacon', 'Pepperoni', 'BBQ', 'Ranch'], ['Thin Crust', 'Bacon', 'Pepperoni', 'Ranch', 'Tomato'], ['Thin Crust', 'Bacon', 'Pepperoni', 'Ranch', 'BBQ'], ['Thin Crust', 'Bacon', 'Steak', 'Tomato', 'BBQ'], ['Thin Crust', 'Bacon', 'Steak', 'Tomato', 'Ranch'], ['Thin Crust', 'Bacon', 'Steak', 'BBQ', 'Tomato'], ['Thin Crust', 'Bacon', 'Steak', 'BBQ', 'Ranch'], ['Thin Crust', 'Bacon', 'Steak', 'Ranch', 'Tomato'], ['Thin Crust', 'Bacon', 'Steak', 'Ranch', 'BBQ'], ['Thin Crust', 'Pepperoni', 'Bacon', 'Tomato', 'BBQ'], ['Thin Crust', 'Pepperoni', 'Bacon', 'Tomato', 'Ranch'], ['Thin Crust', 'Pepperoni', 'Bacon', 'BBQ', 'Tomato'], ['Thin Crust', 'Pepperoni', 'Bacon', 'BBQ', 'Ranch'], ['Thin Crust', 'Pepperoni', 'Bacon', 'Ranch', 'Tomato'], ['Thin Crust', 'Pepperoni', 'Bacon', 'Ranch', 'BBQ'], ['Thin Crust', 'Pepperoni', 'Steak', 'Tomato', 'BBQ'], ['Thin Crust', 'Pepperoni', 'Steak', 'Tomato', 'Ranch'], ['Thin Crust', 'Pepperoni', 'Steak', 'BBQ', 'Tomato'], ['Thin Crust', 'Pepperoni', 'Steak', 'BBQ', 'Ranch'], ['Thin Crust', 'Pepperoni', 'Steak', 'Ranch', 'Tomato'], ['Thin Crust', 'Pepperoni', 'Steak', 'Ranch', 'BBQ'], ['Thin Crust', 'Steak', 'Bacon', 'Tomato', 'BBQ'], ['Thin Crust', 'Steak', 'Bacon', 'Tomato', 'Ranch'], ['Thin Crust', 'Steak', 'Bacon', 'BBQ', 'Tomato'], ['Thin Crust', 'Steak', 'Bacon', 'BBQ', 'Ranch'], ['Thin Crust', 'Steak', 'Bacon', 'Ranch', 'Tomato'], ['Thin Crust', 'Steak', 'Bacon', 'Ranch', 'BBQ'], ['Thin Crust', 'Steak', 'Pepperoni', 'Tomato', 'BBQ'], ['Thin Crust', 'Steak', 'Pepperoni', 'Tomato', 'Ranch'], ['Thin Crust', 'Steak', 'Pepperoni', 'BBQ', 'Tomato'], ['Thin Crust', 'Steak', 'Pepperoni', 'BBQ', 'Ranch'], ['Thin Crust', 'Steak', 'Pepperoni', 'Ranch', 'Tomato'], ['Thin Crust', 'Steak', 'Pepperoni', 'Ranch', 'BBQ'], ['Hand Tossed', 'Bacon', 'Pepperoni', 'Tomato', 'BBQ'], ['Hand Tossed', 'Bacon', 'Pepperoni', 'Tomato', 'Ranch'], ['Hand Tossed', 'Bacon', 'Pepperoni', 'BBQ', 'Tomato'], ['Hand Tossed', 'Bacon', 'Pepperoni', 'BBQ', 'Ranch'], ['Hand Tossed', 'Bacon', 'Pepperoni', 'Ranch', 'Tomato'], ['Hand Tossed', 'Bacon', 'Pepperoni', 'Ranch', 'BBQ'], ['Hand Tossed', 'Bacon', 'Steak', 'Tomato', 'BBQ'], ['Hand Tossed', 'Bacon', 'Steak', 'Tomato', 'Ranch'], ['Hand Tossed', 'Bacon', 'Steak', 'BBQ', 'Tomato'], ['Hand Tossed', 'Bacon', 'Steak', 'BBQ', 'Ranch'], ['Hand Tossed', 'Bacon', 'Steak', 'Ranch', 'Tomato'], ['Hand Tossed', 'Bacon', 'Steak', 'Ranch', 'BBQ'], ['Hand Tossed', 'Pepperoni', 'Bacon', 'Tomato', 'BBQ'], ['Hand Tossed', 'Pepperoni', 'Bacon', 'Tomato', 'Ranch'], ['Hand Tossed', 'Pepperoni', 'Bacon', 'BBQ', 'Tomato'], ['Hand Tossed', 'Pepperoni', 'Bacon', 'BBQ', 'Ranch'], ['Hand Tossed', 'Pepperoni', 'Bacon', 'Ranch', 'Tomato'], ['Hand Tossed', 'Pepperoni', 'Bacon', 'Ranch', 'BBQ'], ['Hand Tossed', 'Pepperoni', 'Steak', 'Tomato', 'BBQ'], ['Hand Tossed', 'Pepperoni', 'Steak', 'Tomato', 'Ranch'], ['Hand Tossed', 'Pepperoni', 'Steak', 'BBQ', 'Tomato'], ['Hand Tossed', 'Pepperoni', 'Steak', 'BBQ', 'Ranch'], ['Hand Tossed', 'Pepperoni', 'Steak', 'Ranch', 'Tomato'], ['Hand Tossed', 'Pepperoni', 'Steak', 'Ranch', 'BBQ'], ['Hand Tossed', 'Steak', 'Bacon', 'Tomato', 'BBQ'], ['Hand Tossed', 'Steak', 'Bacon', 'Tomato', 'Ranch'], ['Hand Tossed', 'Steak', 'Bacon', 'BBQ', 'Tomato'], ['Hand Tossed', 'Steak', 'Bacon', 'BBQ', 'Ranch'], ['Hand Tossed', 'Steak', 'Bacon', 'Ranch', 'Tomato'], ['Hand Tossed', 'Steak', 'Bacon', 'Ranch', 'BBQ'], ['Hand Tossed', 'Steak', 'Pepperoni', 'Tomato', 'BBQ'], ['Hand Tossed', 'Steak', 'Pepperoni', 'Tomato', 'Ranch'], ['Hand Tossed', 'Steak', 'Pepperoni', 'BBQ', 'Tomato'], ['Hand Tossed', 'Steak', 'Pepperoni', 'BBQ', 'Ranch'], ['Hand Tossed', 'Steak', 'Pepperoni', 'Ranch', 'Tomato'], ['Hand Tossed', 'Steak', 'Pepperoni', 'Ranch', 'BBQ']]

You can also use itertools.product to generate all combinations up front, and then filter results with duplicate values:

import itertools as it
r = [i for i in it.product(crust,topping1,topping2,sauce1,sauce2) if len(i) == len(set(i))]

There are already solutions using the itertools module, so here's one built from scratch:

crust = ['Thin Crust', 'Hand Tossed']
topping1 = ['Bacon', 'Pepperoni', 'Steak']
topping2 = ['Bacon', 'Pepperoni', 'Steak']
sauce1 = ['Tomato', 'BBQ', 'Ranch']
sauce2 = ['Tomato', 'BBQ', 'Ranch']

def create_uniques(options, creation_so_far):
    # options is a list of lists
    # creation_so_far is a set of options we've picked
    uniques = set()
    def recurse(options, creation_so_far):
        if not options:
            # we've gone through every list of options we have
            # e.g. we've gone through
            # crust, topping1, topping2, sauce1, sauce2
            # so we add this to our set of uniques
            uniques.add(tuple(sorted(creation_so_far)))
            return
        current_option = options[0] # we pick the current option
        for choice in current_option:
            # make sure the choice we're adding isn't already in our creation_so_far
            if choice not in creation_so_far:
                creation_so_far.add(choice)
                recurse(options[1:], creation_so_far)
                creation_so_far.remove(choice)
    recurse(options, creation_so_far)
    return uniques

uniques = create_uniques([crust,topping1,topping2,sauce1,sauce2], set())

for unique in uniques:
    print(unique)
                                                                                 ```

Just use set() instead of list():

from itertools import product
from pprint import pprint  # just to have a fancy print()

crust = ['Thin Crust', 'Hand Tossed']
topping1 = ['Bacon', 'Pepperoni', 'Steak']
topping2 = ['Bacon', 'Pepperoni', 'Steak']
sauce1 = ['Tomato', 'BBQ', 'Ranch']
sauce2 = ['Tomato', 'BBQ', 'Ranch']

test = set(product(crust,topping1,topping2,sauce1,sauce2))
pprint(test)

The above code will result in:

{('Hand Tossed', 'Bacon', 'Bacon', 'BBQ', 'BBQ'),
 ('Hand Tossed', 'Bacon', 'Bacon', 'BBQ', 'Ranch'),
 ('Hand Tossed', 'Bacon', 'Bacon', 'BBQ', 'Tomato'),
 ('Hand Tossed', 'Bacon', 'Bacon', 'Ranch', 'BBQ'),
 ('Hand Tossed', 'Bacon', 'Bacon', 'Ranch', 'Ranch'),
 ('Hand Tossed', 'Bacon', 'Bacon', 'Ranch', 'Tomato'),
 ('Hand Tossed', 'Bacon', 'Bacon', 'Tomato', 'BBQ'),
 ('Hand Tossed', 'Bacon', 'Bacon', 'Tomato', 'Ranch'),
 ('Hand Tossed', 'Bacon', 'Bacon', 'Tomato', 'Tomato'),
 ('Hand Tossed', 'Bacon', 'Pepperoni', 'BBQ', 'BBQ'),
 ('Hand Tossed', 'Bacon', 'Pepperoni', 'BBQ', 'Ranch'),
 ('Hand Tossed', 'Bacon', 'Pepperoni', 'BBQ', 'Tomato'),
 ('Hand Tossed', 'Bacon', 'Pepperoni', 'Ranch', 'BBQ'),
 ('Hand Tossed', 'Bacon', 'Pepperoni', 'Ranch', 'Ranch'),
 ('Hand Tossed', 'Bacon', 'Pepperoni', 'Ranch', 'Tomato'),
 ('Hand Tossed', 'Bacon', 'Pepperoni', 'Tomato', 'BBQ'),
 ('Hand Tossed', 'Bacon', 'Pepperoni', 'Tomato', 'Ranch'),
 ('Hand Tossed', 'Bacon', 'Pepperoni', 'Tomato', 'Tomato'),
 ('Hand Tossed', 'Bacon', 'Steak', 'BBQ', 'BBQ'),
 ('Hand Tossed', 'Bacon', 'Steak', 'BBQ', 'Ranch'),
 ('Hand Tossed', 'Bacon', 'Steak', 'BBQ', 'Tomato'),
 ('Hand Tossed', 'Bacon', 'Steak', 'Ranch', 'BBQ'),
 ('Hand Tossed', 'Bacon', 'Steak', 'Ranch', 'Ranch'),
 ('Hand Tossed', 'Bacon', 'Steak', 'Ranch', 'Tomato'),
 ('Hand Tossed', 'Bacon', 'Steak', 'Tomato', 'BBQ'),
 ('Hand Tossed', 'Bacon', 'Steak', 'Tomato', 'Ranch'),
 ('Hand Tossed', 'Bacon', 'Steak', 'Tomato', 'Tomato'),
 ('Hand Tossed', 'Pepperoni', 'Bacon', 'BBQ', 'BBQ'),
 ('Hand Tossed', 'Pepperoni', 'Bacon', 'BBQ', 'Ranch'),
 ('Hand Tossed', 'Pepperoni', 'Bacon', 'BBQ', 'Tomato'),
 ('Hand Tossed', 'Pepperoni', 'Bacon', 'Ranch', 'BBQ'),
 ('Hand Tossed', 'Pepperoni', 'Bacon', 'Ranch', 'Ranch'),
 ('Hand Tossed', 'Pepperoni', 'Bacon', 'Ranch', 'Tomato'),
 ('Hand Tossed', 'Pepperoni', 'Bacon', 'Tomato', 'BBQ'),
 ('Hand Tossed', 'Pepperoni', 'Bacon', 'Tomato', 'Ranch'),
 ('Hand Tossed', 'Pepperoni', 'Bacon', 'Tomato', 'Tomato'),
 ('Hand Tossed', 'Pepperoni', 'Pepperoni', 'BBQ', 'BBQ'),
 ('Hand Tossed', 'Pepperoni', 'Pepperoni', 'BBQ', 'Ranch'),
 ('Hand Tossed', 'Pepperoni', 'Pepperoni', 'BBQ', 'Tomato'),
 ('Hand Tossed', 'Pepperoni', 'Pepperoni', 'Ranch', 'BBQ'),
 ('Hand Tossed', 'Pepperoni', 'Pepperoni', 'Ranch', 'Ranch'),
 ('Hand Tossed', 'Pepperoni', 'Pepperoni', 'Ranch', 'Tomato'),
 ('Hand Tossed', 'Pepperoni', 'Pepperoni', 'Tomato', 'BBQ'),
 ('Hand Tossed', 'Pepperoni', 'Pepperoni', 'Tomato', 'Ranch'),
 ('Hand Tossed', 'Pepperoni', 'Pepperoni', 'Tomato', 'Tomato'),
 ('Hand Tossed', 'Pepperoni', 'Steak', 'BBQ', 'BBQ'),
 ('Hand Tossed', 'Pepperoni', 'Steak', 'BBQ', 'Ranch'),
 ('Hand Tossed', 'Pepperoni', 'Steak', 'BBQ', 'Tomato'),
 ('Hand Tossed', 'Pepperoni', 'Steak', 'Ranch', 'BBQ'),
 ('Hand Tossed', 'Pepperoni', 'Steak', 'Ranch', 'Ranch'),
 ('Hand Tossed', 'Pepperoni', 'Steak', 'Ranch', 'Tomato'),
 ('Hand Tossed', 'Pepperoni', 'Steak', 'Tomato', 'BBQ'),
 ('Hand Tossed', 'Pepperoni', 'Steak', 'Tomato', 'Ranch'),
 ('Hand Tossed', 'Pepperoni', 'Steak', 'Tomato', 'Tomato'),
 ('Hand Tossed', 'Steak', 'Bacon', 'BBQ', 'BBQ'),
 ('Hand Tossed', 'Steak', 'Bacon', 'BBQ', 'Ranch'),
 ('Hand Tossed', 'Steak', 'Bacon', 'BBQ', 'Tomato'),
 ('Hand Tossed', 'Steak', 'Bacon', 'Ranch', 'BBQ'),
 ('Hand Tossed', 'Steak', 'Bacon', 'Ranch', 'Ranch'),
 ('Hand Tossed', 'Steak', 'Bacon', 'Ranch', 'Tomato'),
 ('Hand Tossed', 'Steak', 'Bacon', 'Tomato', 'BBQ'),
 ('Hand Tossed', 'Steak', 'Bacon', 'Tomato', 'Ranch'),
 ('Hand Tossed', 'Steak', 'Bacon', 'Tomato', 'Tomato'),
 ('Hand Tossed', 'Steak', 'Pepperoni', 'BBQ', 'BBQ'),
 ('Hand Tossed', 'Steak', 'Pepperoni', 'BBQ', 'Ranch'),
 ('Hand Tossed', 'Steak', 'Pepperoni', 'BBQ', 'Tomato'),
 ('Hand Tossed', 'Steak', 'Pepperoni', 'Ranch', 'BBQ'),
 ('Hand Tossed', 'Steak', 'Pepperoni', 'Ranch', 'Ranch'),
 ('Hand Tossed', 'Steak', 'Pepperoni', 'Ranch', 'Tomato'),
 ('Hand Tossed', 'Steak', 'Pepperoni', 'Tomato', 'BBQ'),
 ('Hand Tossed', 'Steak', 'Pepperoni', 'Tomato', 'Ranch'),
 ('Hand Tossed', 'Steak', 'Pepperoni', 'Tomato', 'Tomato'),
 ('Hand Tossed', 'Steak', 'Steak', 'BBQ', 'BBQ'),
 ('Hand Tossed', 'Steak', 'Steak', 'BBQ', 'Ranch'),
 ('Hand Tossed', 'Steak', 'Steak', 'BBQ', 'Tomato'),
 ('Hand Tossed', 'Steak', 'Steak', 'Ranch', 'BBQ'),
 ('Hand Tossed', 'Steak', 'Steak', 'Ranch', 'Ranch'),
 ('Hand Tossed', 'Steak', 'Steak', 'Ranch', 'Tomato'),
 ('Hand Tossed', 'Steak', 'Steak', 'Tomato', 'BBQ'),
 ('Hand Tossed', 'Steak', 'Steak', 'Tomato', 'Ranch'),
 ('Hand Tossed', 'Steak', 'Steak', 'Tomato', 'Tomato'),
 ('Thin Crust', 'Bacon', 'Bacon', 'BBQ', 'BBQ'),
 ('Thin Crust', 'Bacon', 'Bacon', 'BBQ', 'Ranch'),
 ('Thin Crust', 'Bacon', 'Bacon', 'BBQ', 'Tomato'),
 ('Thin Crust', 'Bacon', 'Bacon', 'Ranch', 'BBQ'),
 ('Thin Crust', 'Bacon', 'Bacon', 'Ranch', 'Ranch'),
 ('Thin Crust', 'Bacon', 'Bacon', 'Ranch', 'Tomato'),
 ('Thin Crust', 'Bacon', 'Bacon', 'Tomato', 'BBQ'),
 ('Thin Crust', 'Bacon', 'Bacon', 'Tomato', 'Ranch'),
 ('Thin Crust', 'Bacon', 'Bacon', 'Tomato', 'Tomato'),
 ('Thin Crust', 'Bacon', 'Pepperoni', 'BBQ', 'BBQ'),
 ('Thin Crust', 'Bacon', 'Pepperoni', 'BBQ', 'Ranch'),
 ('Thin Crust', 'Bacon', 'Pepperoni', 'BBQ', 'Tomato'),
 ('Thin Crust', 'Bacon', 'Pepperoni', 'Ranch', 'BBQ'),
 ('Thin Crust', 'Bacon', 'Pepperoni', 'Ranch', 'Ranch'),
 ('Thin Crust', 'Bacon', 'Pepperoni', 'Ranch', 'Tomato'),
 ('Thin Crust', 'Bacon', 'Pepperoni', 'Tomato', 'BBQ'),
 ('Thin Crust', 'Bacon', 'Pepperoni', 'Tomato', 'Ranch'),
 ('Thin Crust', 'Bacon', 'Pepperoni', 'Tomato', 'Tomato'),
 ('Thin Crust', 'Bacon', 'Steak', 'BBQ', 'BBQ'),
 ('Thin Crust', 'Bacon', 'Steak', 'BBQ', 'Ranch'),
 ('Thin Crust', 'Bacon', 'Steak', 'BBQ', 'Tomato'),
 ('Thin Crust', 'Bacon', 'Steak', 'Ranch', 'BBQ'),
 ('Thin Crust', 'Bacon', 'Steak', 'Ranch', 'Ranch'),
 ('Thin Crust', 'Bacon', 'Steak', 'Ranch', 'Tomato'),
 ('Thin Crust', 'Bacon', 'Steak', 'Tomato', 'BBQ'),
 ('Thin Crust', 'Bacon', 'Steak', 'Tomato', 'Ranch'),
 ('Thin Crust', 'Bacon', 'Steak', 'Tomato', 'Tomato'),
 ('Thin Crust', 'Pepperoni', 'Bacon', 'BBQ', 'BBQ'),
 ('Thin Crust', 'Pepperoni', 'Bacon', 'BBQ', 'Ranch'),
 ('Thin Crust', 'Pepperoni', 'Bacon', 'BBQ', 'Tomato'),
 ('Thin Crust', 'Pepperoni', 'Bacon', 'Ranch', 'BBQ'),
 ('Thin Crust', 'Pepperoni', 'Bacon', 'Ranch', 'Ranch'),
 ('Thin Crust', 'Pepperoni', 'Bacon', 'Ranch', 'Tomato'),
 ('Thin Crust', 'Pepperoni', 'Bacon', 'Tomato', 'BBQ'),
 ('Thin Crust', 'Pepperoni', 'Bacon', 'Tomato', 'Ranch'),
 ('Thin Crust', 'Pepperoni', 'Bacon', 'Tomato', 'Tomato'),
 ('Thin Crust', 'Pepperoni', 'Pepperoni', 'BBQ', 'BBQ'),
 ('Thin Crust', 'Pepperoni', 'Pepperoni', 'BBQ', 'Ranch'),
 ('Thin Crust', 'Pepperoni', 'Pepperoni', 'BBQ', 'Tomato'),
 ('Thin Crust', 'Pepperoni', 'Pepperoni', 'Ranch', 'BBQ'),
 ('Thin Crust', 'Pepperoni', 'Pepperoni', 'Ranch', 'Ranch'),
 ('Thin Crust', 'Pepperoni', 'Pepperoni', 'Ranch', 'Tomato'),
 ('Thin Crust', 'Pepperoni', 'Pepperoni', 'Tomato', 'BBQ'),
 ('Thin Crust', 'Pepperoni', 'Pepperoni', 'Tomato', 'Ranch'),
 ('Thin Crust', 'Pepperoni', 'Pepperoni', 'Tomato', 'Tomato'),
 ('Thin Crust', 'Pepperoni', 'Steak', 'BBQ', 'BBQ'),
 ('Thin Crust', 'Pepperoni', 'Steak', 'BBQ', 'Ranch'),
 ('Thin Crust', 'Pepperoni', 'Steak', 'BBQ', 'Tomato'),
 ('Thin Crust', 'Pepperoni', 'Steak', 'Ranch', 'BBQ'),
 ('Thin Crust', 'Pepperoni', 'Steak', 'Ranch', 'Ranch'),
 ('Thin Crust', 'Pepperoni', 'Steak', 'Ranch', 'Tomato'),
 ('Thin Crust', 'Pepperoni', 'Steak', 'Tomato', 'BBQ'),
 ('Thin Crust', 'Pepperoni', 'Steak', 'Tomato', 'Ranch'),
 ('Thin Crust', 'Pepperoni', 'Steak', 'Tomato', 'Tomato'),
 ('Thin Crust', 'Steak', 'Bacon', 'BBQ', 'BBQ'),
 ('Thin Crust', 'Steak', 'Bacon', 'BBQ', 'Ranch'),
 ('Thin Crust', 'Steak', 'Bacon', 'BBQ', 'Tomato'),
 ('Thin Crust', 'Steak', 'Bacon', 'Ranch', 'BBQ'),
 ('Thin Crust', 'Steak', 'Bacon', 'Ranch', 'Ranch'),
 ('Thin Crust', 'Steak', 'Bacon', 'Ranch', 'Tomato'),
 ('Thin Crust', 'Steak', 'Bacon', 'Tomato', 'BBQ'),
 ('Thin Crust', 'Steak', 'Bacon', 'Tomato', 'Ranch'),
 ('Thin Crust', 'Steak', 'Bacon', 'Tomato', 'Tomato'),
 ('Thin Crust', 'Steak', 'Pepperoni', 'BBQ', 'BBQ'),
 ('Thin Crust', 'Steak', 'Pepperoni', 'BBQ', 'Ranch'),
 ('Thin Crust', 'Steak', 'Pepperoni', 'BBQ', 'Tomato'),
 ('Thin Crust', 'Steak', 'Pepperoni', 'Ranch', 'BBQ'),
 ('Thin Crust', 'Steak', 'Pepperoni', 'Ranch', 'Ranch'),
 ('Thin Crust', 'Steak', 'Pepperoni', 'Ranch', 'Tomato'),
 ('Thin Crust', 'Steak', 'Pepperoni', 'Tomato', 'BBQ'),
 ('Thin Crust', 'Steak', 'Pepperoni', 'Tomato', 'Ranch'),
 ('Thin Crust', 'Steak', 'Pepperoni', 'Tomato', 'Tomato'),
 ('Thin Crust', 'Steak', 'Steak', 'BBQ', 'BBQ'),
 ('Thin Crust', 'Steak', 'Steak', 'BBQ', 'Ranch'),
 ('Thin Crust', 'Steak', 'Steak', 'BBQ', 'Tomato'),
 ('Thin Crust', 'Steak', 'Steak', 'Ranch', 'BBQ'),
 ('Thin Crust', 'Steak', 'Steak', 'Ranch', 'Ranch'),
 ('Thin Crust', 'Steak', 'Steak', 'Ranch', 'Tomato'),
 ('Thin Crust', 'Steak', 'Steak', 'Tomato', 'BBQ'),
 ('Thin Crust', 'Steak', 'Steak', 'Tomato', 'Ranch'),
 ('Thin Crust', 'Steak', 'Steak', 'Tomato', 'Tomato')}

Or 162 unique combinations:

>>> len(set(product(crust,topping1,topping2,sauce1,sauce2)))
162
Related