diff options
| author | Raymond Hettinger <python@rcn.com> | 2009-01-27 09:33:06 (GMT) | 
|---|---|---|
| committer | Raymond Hettinger <python@rcn.com> | 2009-01-27 09:33:06 (GMT) | 
| commit | 2976aaa39666229fa9591f219b4642f8ccbcc30a (patch) | |
| tree | 2bed280d4b30daac178ac0febd8ecc26f837d73a /Lib/test/test_itertools.py | |
| parent | 1763f8adb4d2d7b59fefedff0aa8ed652c4fe8d2 (diff) | |
| download | cpython-2976aaa39666229fa9591f219b4642f8ccbcc30a.zip cpython-2976aaa39666229fa9591f219b4642f8ccbcc30a.tar.gz cpython-2976aaa39666229fa9591f219b4642f8ccbcc30a.tar.bz2  | |
Add tests to verify combinatoric relationships.
Diffstat (limited to 'Lib/test/test_itertools.py')
| -rw-r--r-- | Lib/test/test_itertools.py | 26 | 
1 files changed, 26 insertions, 0 deletions
diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index 23a8765..8d8e059 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -106,6 +106,14 @@ class TestBasicOps(unittest.TestCase):                  if sorted(indices) == list(indices):                      yield tuple(pool[i] for i in indices) +        def combinations3(iterable, r): +            'Pure python version from cwr()' +            pool = tuple(iterable) +            n = len(pool) +            for indices in combinations_with_replacement(range(n), r): +                if len(set(indices)) == r: +                    yield tuple(pool[i] for i in indices) +          for n in range(7):              values = [5*x-12 for x in range(n)]              for r in range(n+2): @@ -122,6 +130,7 @@ class TestBasicOps(unittest.TestCase):                                       [e for e in values if e in c])      # comb is a subsequence of the input iterable                  self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version                  self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version +                self.assertEqual(result, list(combinations3(values, r))) # matches second pure python version          # Test implementation detail:  tuple re-use          self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1) @@ -261,6 +270,23 @@ class TestBasicOps(unittest.TestCase):          self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)          self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1) +    def test_combinatorics(self): +        # Test relationships between product(), permutations(), +        # combinations() and combinations_with_replacement(). + +        s = 'ABCDE' +        for r in range(8): +            prod = list(product(s, repeat=r)) +            cwr = list(combinations_with_replacement(s, r)) +            perm = list(permutations(s, r)) +            comb = list(combinations(s, r)) + +            self.assertEquals(cwr, [t for t in prod if sorted(t)==list(t)]) # cwr: prods which are sorted +            self.assertEquals(perm, [t for t in prod if len(set(t))==r])    # perm: prods with no dups +            self.assertEqual(comb, [t for t in perm if sorted(t)==list(t)]) # comb: perms that are sorted +            self.assertEqual(comb, [t for t in cwr if len(set(t))==r])      # comb: cwrs without dups +            self.assertEqual(set(comb), set(cwr) & set(perm))               # comb: both a cwr and a perm +      def test_compress(self):          self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))          self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list(''))  | 
