如何在Python列表中计数可能性
假设你有这样一个列表:
num = [1, 2, 3, 4, 5]
这里面有10种三元素的组合:
[123, 124, 125, 134, 135, 145, 234, 235, 245, 345]
我该怎么生成这个列表呢?
4 个回答
2
我想你是在寻找二项式系数:
5
你在说的是组合。从一个有 n 个元素的列表中选出 k 个元素的方式有 n!/(k! * (n - k)!) 种。所以:
>>> num = [1, 2, 3, 4, 5]
>>> fac = lambda n: 1 if n < 2 else n * fac(n - 1)
>>> combos = lambda n, k: fac(n) / fac(k) / fac(n - k)
>>> combos(len(num), 3)
10
只有当你真的想生成所有组合时,才使用itertools.combinations。如果你只是想知道不同组合的数量,就不要用这个。
另外,还有比上面代码更高效的方法来计算组合的数量。例如,
>>> from operator import truediv, mul
>>> from itertools import starmap
>>> from functools import reduce
>>> combos = lambda n, k: reduce(mul, starmap(truediv, zip(range(n, n - k, -1), range(k, 0, -1))))
>>> combos(len(num), 3)
10.0
(注意,这段代码使用了浮点数除法!)
10
import itertools
num = [1, 2, 3, 4, 5]
combinations = []
for combination in itertools.combinations(num, 3):
combinations.append(int("".join(str(i) for i in combination)))
# => [123, 124, 125, 134, 135, 145, 234, 235, 245, 345]
print len(combinations)
# => 10
编辑
如果你只关心组合的数量,可以不使用 int()、join() 和 str() 这些函数。itertools.combinations() 会给你一些元组,这可能已经足够了。