尝试找到所有可能的组合和分组
我一直在用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