尝试找到所有可能的组合和分组

1 投票
3 回答
1332 浏览
提问于 2025-04-20 21:21

我一直在用Excel解决一个问题,但我发现用Python可能更合适。不过我不知道从哪里开始,因为我对Python的了解还很基础。你们会怎么处理这个问题呢?

现在有6种咖啡和10种风味添加剂,你可以在每种咖啡里放1到3种风味添加剂。基于这个情况,我想知道(并列出)所有独特的风味组合,以及你能多久不喝到同样的咖啡。

3 个回答

1

这听起来其实是用itertools.product来解决的问题:

我们可以把咖啡定义为:

 coffee = ["C1","C2","C3","C4","C5","C6"]

然后把风味添加剂定义为:

 flavor = ["F1","F2","F3","F4","F5","F6","F7","F8","F9","F10"]

一种风味添加剂:

 itertools.product(coffee,flavor)

两种风味添加剂:

 [i for i in itertools.product(coffee,flavor,flavor) if i[1] != i[2]]

三种风味添加剂:

 [i for i in itertools.product(coffee,flavor,flavor, flavor) if i[1] != i[2] and i[2] != i[3] and i[1] != i[3]]
2
>>> flavor = ["F1","F2","F3","F4","F5","F6","F7","F8","F9","F10"]
>>> coffee = ["C1","C2","C3","C4","C5","C6"]
>>> from itertools import product, combinations, chain
>>> len(list(product(coffee, chain(combinations(flavor, 1), combinations(flavor, 2), combinations(flavor, 3)))))
1050
>>> list(product(coffee, chain(combinations(flavor, 1), combinations(flavor, 2), combinations(flavor, 3))))
[('C1', ('F1',)), ('C1', ('F2',)), ('C1', ('F3',)), ('C1', ('F4',)), ('C1', ('F5',)), ('C1', ('F6',)), ('C1', ('F7',)), ('C1', ('F8',)), ('C1', ('F9',)), ('C1', ('F10',)), ('C1', ('F1', 'F2')), ('C1', ('F1', 'F3')), ('C1', ('F1', 'F4')), ('C1', ('F1', 'F5')), ('C1', ('F1', 'F6')), ('C1', ('F1', 'F7')), ('C1', ('F1', 'F8')), ('C1', ('F1', 'F9')), ('C1', ('F1', 'F10')), ('C1', ('F2', 'F3')), ...

我觉得这样说是对的。我们把所有的咖啡口味组合成1、2和3个口味的组合,然后把这些组合连成一个可以逐个取出的列表。接着,我们把每种口味的组合和每种咖啡都结合起来,形成新的组合。

2

使用 itertools.combinations 这个工具,你可以轻松得到所有不同的口味组合:

from itertools import combinations

shots = range(1,11)
N = 3

coms = [c for n in range(1, N+1) for c in combinations(shots, n)]

coms 的长度会告诉你组合的数量,如果你有6种口味,并且选择1、2或3种,那么总共有175种组合。

当这些口味组合加到咖啡里时,组合的总数就是 6 * 175 = 1050

补充说明

另外(顺便提一下),你其实不需要通过编程来做这个。如果你有n个元素,想知道从中选出k个的不同方式有多少种,那么这个数量可以用 二项式系数 来计算,公式是 C(n, k) = n!/(k!*(n-k)!)

在你的例子中,n=10,k可以是1、2或3。所以你的结果是:

C(10, {1, 2, 3}) = C(10, 3) + C(10, 2) + C(10, 1)
                 = 10!/(3!*(10-3)!) + 10!/(2!*(10-2)!) + 10!/(1!*(10-1)!)
                 = 175
           Total = 175 * 6 = 1050

撰写回答