如何在Python列表中计数可能性

3 投票
4 回答
3211 浏览
提问于 2025-04-15 14:01

假设你有这样一个列表:

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

使用 itertools.combinations

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() 会给你一些元组,这可能已经足够了。

撰写回答