From 3369167089cb2390b16ced87a0c54a3678342e83 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 19 Jul 2008 00:43:00 +0000 Subject: [PATCH] Add recipe to the itertools docs. --- Doc/library/itertools.rst | 15 +++++++++++++++ Lib/test/test_itertools.py | 18 ++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 81b2c7fed5..9a3626f98c 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -701,3 +701,18 @@ which incur interpreter overhead. for d, s in izip(data, selectors): if s: yield d + + def combinations_with_replacement(iterable, r): + "combinations_with_replacement('ABC', 3) --> AA AB AC BB BC CC" + pool = tuple(iterable) + n = len(pool) + indices = [0] * r + yield tuple(pool[i] for i in indices) + while 1: + for i in reversed(range(r)): + if indices[i] != n - 1: + break + else: + return + indices[i:] = [indices[i] + 1] * (r - i) + yield tuple(pool[i] for i in indices) diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index 98cceb7f09..82e1ee43e8 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -1285,6 +1285,21 @@ Samuele ... if s: ... yield d +>>> def combinations_with_replacement(iterable, r): +... "combinations_with_replacement('ABC', 3) --> AA AB AC BB BC CC" +... pool = tuple(iterable) +... n = len(pool) +... indices = [0] * r +... yield tuple(pool[i] for i in indices) +... while 1: +... for i in reversed(range(r)): +... if indices[i] != n - 1: +... break +... else: +... return +... indices[i:] = [indices[i] + 1] * (r - i) +... yield tuple(pool[i] for i in indices) + This is not part of the examples but it tests to make sure the definitions perform as purported. @@ -1362,6 +1377,9 @@ False >>> list(compress('abcdef', [1,0,1,0,1,1])) ['a', 'c', 'e', 'f'] +>>> list(combinations_with_replacement('abc', 2)) +[('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')] + """ __test__ = {'libreftest' : libreftest} -- 2.49.0