假设有一个列表[1,2,3,4,5]
,我需要获得元素(或'子列表')的所有可能组合的计数,例如1, 2, 3, 4, 5, 12, 13, 14, ..., 123, 124, ..., 12345
。
我知道如何得到nCr
,r
个元素与n
个元素的列表的组合的计数。
Python 3.8或以上版本:
from math import comb
p, r = 5, 2
print(comb(p, r))
然后我可以做nC1 + nC2 +...+ nCn
。但是有更好/更快的方法吗?
p, result = 5, 0
for r in range(1, 6):
result += comb(p, r)
print(result)
感谢您的回答。
这个概念在数学中称为幂集,它指的是给定集合的所有子集。你的问题是关于幂集2^n
的大小,其中n
是原始集的大小。这个总数包括空集,所以正如C4stor所说,您的总数将是2^n - 1
。
如果输入的所有元素都是唯一的,则上述答案有效。如果有重复的元素,则取每个元素的乘积(count + 1),并在最后再减去1以删除空集。
。[1,1,1,2,2,3]:我们的计数是3,2,1,所以我们的答案是4 * 3 * 2 - 1 = 23。
这个想法是,对于每个元素,你可以在你的子列表中从0到count(element)的任何地方。
这个特定的和等于2^n -1
:-)