Add multinomial to the itertools recipes docs (gh-129760)

This commit is contained in:
Raymond Hettinger 2025-02-06 18:35:55 -06:00 committed by GitHub
parent a191d6f78e
commit e1e85204ed
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -838,10 +838,10 @@ and :term:`generators <generator>` which incur interpreter overhead.
.. testcode::
from collections import deque
from collections import Counter, deque
from contextlib import suppress
from functools import reduce
from math import sumprod, isqrt
from math import comb, prod, sumprod, isqrt
from operator import itemgetter, getitem, mul, neg
def take(n, iterable):
@ -1127,6 +1127,12 @@ The following recipes have a more mathematical flavor:
n -= n // prime
return n
def multinomial(*counts):
"Number of distinct arrangements of a multiset."
# Counter('abracadabra').values() -> 5 2 1 1 2
# multinomial(5, 2, 1, 1, 2) → 83160
return prod(map(comb, accumulate(counts), counts))
.. doctest::
:hide:
@ -1730,6 +1736,12 @@ The following recipes have a more mathematical flavor:
>>> ''.join(it)
'DEF1'
>>> multinomial(5, 2, 1, 1, 2)
83160
>>> word = 'coffee'
>>> multinomial(*Counter(word).values()) == len(set(permutations(word)))
True
.. testcode::
:hide: