python的多重系数

2024-04-26 09:31:03 发布

您现在位置:Python中文网/ 问答频道 /正文

问题是: 设9个不同的对象,找出将其分成2组、3组和4组的所有方法。在

从数学上讲,除法的总数可以表示为9!/2个!三!4个!在

这是我尝试过的

import itertools
def multiCoef(seta, n1, n2):
  seta = set(seta)
  for comba in itertools.combinations(seta, n1):
    comba = set(comba)
    for combb in itertools.combinations(seta-comba, n2):
      combb = set(combb)
      yield comba, combb, seta-comba-combb

你可以试试这样的东西,它运行得很好:

^{pr2}$

但一旦群组数量增加,这种方法就变得麻烦了。有更好的方法吗?在


Tags: 对象方法inimportfor数学itertoolsset
3条回答

一旦您定义了函数子集(a,b),用于枚举a中所有大小为b的子集

for i in subsets(mySet,2):
    for j in subsets(mySet.difference(i),3):
        for k in subsets(j.difference(k),4)
            print i,j,k

要找到在m,n,p组中划分(m+n+p)项的方法的数目,首先将集合分成m组,然后将这些组中的每一组除以n,然后再除以p。在

把(m+n+p)项分成(n+p)组的方法是

==>;(n+m+n)Cn+p

==>;(m+n+p)!/(m!*(n+p)!)在

把(n+p)项分成n组的方法是

==>;(n+p)Cn

==>;(n+p)!/(n!*(p) !)在

所以(n+m+n)Cm*(n+p)Cn=(m+n+p)!/(m!*(n+p)!)*(n+p)!/(n!*(p) !)在

==>;(m+n+p)!/(m!*n!*p!)在

要进行组合,我们可以使用itertools.combinations

给定m=4,n=3,p=2

将小组分成(n+p)=5个项目

>>> g1=(x for x in itertools.combinations(xrange(9),5))

注意:你可以把它当作一个生成器。在

将这些组分成n个项目的子组=3个项目

^{pr2}$

注意:tuple(set(g)-set(x))将提供元素not is x,即组的另一部分

组的大小是

>>> len(groups)
1260
>>>

现在验证

>>> factorial(9)/(factorial(2)*factorial(3)*factorial(4))
1260

相关问题 更多 >