multinomial combinations

Chris Rebert clp2 at rebertia.com
Sat Sep 24 09:35:42 CEST 2011


On Sat, Sep 24, 2011 at 12:06 AM, Dr. Phillip M. Feldman
<Phillip.M.Feldman at gmail.com> wrote:
>
> I wrote a small generator function that produces multinomial combinations.
> (Python's itertools module does ordinary combinations, but not multinomial
> combinations).  The code essentially works, except that the the last
> combination in each tuple is not enclosed in a nested tuple:
>
> In [2]: x= multinomial_combinations(range(7),[2,1,2])
>
> In [3]: x.next()
> Out[3]: ((0, 1), (2,), 3, 4)
>
> (The 3 and 4 should be enclosed in a nested tuple).
>
> Any suggestions as to what I'm doing wrong will be appreciated.  My code
> follows:
>
> def multinomial_combinations(items, ns):
>
>   if len(ns) == 1:
>      for c in itertools.combinations(items, ns[0]):
>         yield c

FWIW, changing the base case to:

    if not ns:
        yield ()

appears to fix the issue. (Disclaimer: Have not done additional testing.)

Cheers,
Chris

>   else:
>      for c_first in itertools.combinations(items, ns[0]):
>         items_remaining= set(items) - set(c_first)
>         for c_other in multinomial_combinations(items_remaining, ns[1:]):
>            yield (c_first,) + c_other



More information about the Python-list mailing list