python中有数学nCr函数吗?

Jam*_*rtz 155 python math function

可能的重复:
统计:Python中的
组合计数组合和排列有效地
在python中计划euler问题(问题53)

我想看看在python中使用数学库内置的是nCr(n选择r)函数:

在此输入图像描述

我知道这可以编程,但我想我会先查看它是否已经内置.

Mar*_*nen 167

你想要迭代吗?itertools.combinations.常用用法:

>>> import itertools
>>> itertools.combinations('abcd',2)
<itertools.combinations object at 0x01348F30>
>>> list(itertools.combinations('abcd',2))
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]
>>> [''.join(x) for x in itertools.combinations('abcd',2)]
['ab', 'ac', 'ad', 'bc', 'bd', 'cd']
Run Code Online (Sandbox Code Playgroud)

如果您只需要计算公式,请使用math.factorial:

import math

def nCr(n,r):
    f = math.factorial
    return f(n) / f(r) / f(n-r)

if __name__ == '__main__':
    print nCr(4,2)
Run Code Online (Sandbox Code Playgroud)

在Python 3中,使用整数除法//而不是/为了避免溢出:

return f(n) // f(r) // f(n-r)

产量

6
Run Code Online (Sandbox Code Playgroud)

  • 有关更好的答案,请访问http://stackoverflow.com/questions/3025162/statistics-combinations-in-python,例如scipy.comb或gmpy.comb. (15认同)
  • @Renato:你在说什么?这个答案根本不危险.你认为`math.factorial`会返回一个浮点数,而不是一个任意精度的整数吗? (7认同)
  • 是的,但那会慢得多. (4认同)
  • 对于某些"慢"的定义.如果计算扑克赔率是完全可以接受的.OP没有具体说明. (4认同)
  • 在我的系统上,计算“10000 C 500”需要 10 毫秒并返回 861 位数字的答案。准确而不是特别“慢”:^) (4认同)

dhe*_*aur 154

以下程序nCr以有效的方式计算(与计算因子等相比)

import operator as op
from functools import reduce

def ncr(n, r):
    r = min(r, n-r)
    numer = reduce(op.mul, range(n, n-r, -1), 1)
    denom = reduce(op.mul, range(1, r+1), 1)
    return numer / denom
Run Code Online (Sandbox Code Playgroud)

  • 分母可以使用阶乘计算,在Python 2中可以比较(在r增加时稍慢)?在Python 3中要快得多. (4认同)
  • @CharlieParker,在许多环境中安装 numpy 并非易事。另外,为什么要为这么简单的问题费这么大劲呢? (4认同)
  • 认真吗?没有标准库,例如numpy等? (3认同)
  • 如果你想处理不可能的场景(r <0或r> n),那么和:`如果r <0:在将r重置为min后返回0`. (3认同)
  • 为什么理解不仅仅是xrange? (2认同)
  • 为什么要等到Python 3.8?哦 (2认同)