From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Fri, 7 Feb 2025 00:45:15 +0000 (+0100) Subject: [3.13] Add multinomial to the itertools recipes docs (gh-129760) (gh-129762) X-Git-Tag: v3.13.3~305 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=aae0a1f90441467b27a1e7bce03b2aeb98e70ab3;p=thirdparty%2FPython%2Fcpython.git [3.13] Add multinomial to the itertools recipes docs (gh-129760) (gh-129762) --- diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index e487fc4d5535..8e78ae9cc00f 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -838,10 +838,10 @@ and :term:`generators ` 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: