mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
Add multinomial to the itertools recipes docs (gh-129760)
This commit is contained in:
parent
a191d6f78e
commit
e1e85204ed
1 changed files with 14 additions and 2 deletions
|
@ -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:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue