寻找两个相同列表集合的所有独特组合?

3

我有两组相同的列表和另一个列表,我想找出其中所有独特的组合。我很难想出一种方法,在不在同一行中重复项的情况下获取这些组合(例如:bacon,bacon)。

我的列表:

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

我试图获得一个按照以下顺序列出所有唯一组合的输出: 面饼|配料1|配料2|酱料1|酱料2 例如:

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

尝试:

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)

我的第一个攻击思路是使用itertools,但我不知道如何防止像上面提到的同一行中出现重复项。有没有关于如何做到这一点的想法?


1
在分配给 test 的行中,使用 set() 而不是 list() - accdias
1
为了简化问题,看起来您只需要使用一对列表。也就是说,您想要获取 ('Bacon', 'Pepperoni'), ('Bacon', 'Steak'), ('Pepperoni', 'Steak'),而不是其他任何内容,对吗? - wjandrea
4个回答

4
如果我理解正确的话,你实际上正在寻找每一种配料和酱汁的2项组合,并将它们与“crust”相乘。如果是这样,你不需要完全相同的列表。
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=', ')

输出:

[('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

这对我非常有帮助,有没有一种简单的方法将此输出转换为CSV文件? - mcfadX
@mcfadX 你是什么意思?这里的输出格式在某些方言中已经是有效的CSV格式了。 - wjandrea
抱歉,我的意思是如何将它写入可以在Excel中打开的CSV文件。 @wjandrea - mcfadX

2
你可以使用一个递归生成器函数:

您可以使用递归生成器函数:

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

输出:

[['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']]

你可以使用 itertools.product 来预先生成所有组合,然后使用重复值过滤结果:
import itertools as it
r = [i for i in it.product(crust,topping1,topping2,sauce1,sauce2) if len(i) == len(set(i))]

1
为什么要在循环中使用 filter?为什么不直接在循环中过滤呢?for i in d[0]: if i not in c: ... - wjandrea
@wjandrea 这样更简洁、更短,而且由于 filter 是作为生成器实现的,不会对性能产生负面影响。 - Ajax1234

2

已经有使用itertools模块的解决方案了,所以这里提供一个从头开始构建的解决方案:

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)
                                                                                 ```


1
只需使用 set() 而不是 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)

上述代码将会得到以下结果:
{('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')}

或 162 种独特的组合:

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

1
我认为你误解了“唯一”的部分。OP希望在每个项目中没有重复的配料或酱料。否则,在示例输出中会看到“番茄,番茄”。 - wjandrea
如果这真的是一个问题,那么拥有两个完全相同的配料列表是没有意义的。我的解决方案建立在这样的思想基础上:即某人能够从两个列表中挑选配料,并且即使它们相同,也可以选择其中2个。 - accdias
1
这就是我说的!哈哈 :) 看看我的回答 - wjandrea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接