Commit 063a4b68 authored by Raymond Hettinger's avatar Raymond Hettinger

Add and update itertools recipes.

parent 46fca077
...@@ -455,7 +455,7 @@ loops that truncate the stream. ...@@ -455,7 +455,7 @@ loops that truncate the stream.
def product(*args, repeat=1): def product(*args, repeat=1):
# product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
# product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111 # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
pools = map(tuple, args) * repeat pools = [tuple(pool) for pool in args] * repeat
result = [[]] result = [[]]
for pool in pools: for pool in pools:
result = [x+[y] for x in result for y in pool] result = [x+[y] for x in result for y in pool]
...@@ -617,7 +617,8 @@ which incur interpreter overhead. ...@@ -617,7 +617,8 @@ which incur interpreter overhead.
return sum(map(operator.mul, vec1, vec2)) return sum(map(operator.mul, vec1, vec2))
def flatten(listOfLists): def flatten(listOfLists):
return list(chain.from_iterable(listOfLists)) "Flatten one level of nesting"
return chain.from_iterable(listOfLists)
def repeatfunc(func, times=None, *args): def repeatfunc(func, times=None, *args):
"""Repeat calls to func with specified arguments. """Repeat calls to func with specified arguments.
...@@ -703,6 +704,27 @@ which incur interpreter overhead. ...@@ -703,6 +704,27 @@ which incur interpreter overhead.
except exception: except exception:
pass pass
def random_product(*args, repeat=1):
"Random selection from itertools.product(*args, **kwds)"
pools = [tuple(pool) for pool in args] * repeat
return [random.choice(pool) for pool in pools]
def random_permuation(iterable, r=None):
"Random selection from itertools.permutations(iterable, r)"
pool = tuple(iterable)
r = len(pool) if r is None else r
return random.sample(pool, r)
def random_combination(iterable, r):
"Random selection from itertools.combinations(iterable, r)"
pool = tuple(iterable)
return sorted(random.sample(pool, r), key=pool.index)
def random_combination_with_replacement(iterable, r):
"Random selection from itertools.combinations_with_replacement(iterable, r)"
pool = tuple(iterable)
return sorted(map(random.choice, repeat(pool, r)), key=pool.index)
Note, many of the above recipes can be optimized by replacing global lookups Note, many of the above recipes can be optimized by replacing global lookups
with local variables defined as default values. For example, the with local variables defined as default values. For example, the
*dotproduct* recipe can be written as:: *dotproduct* recipe can be written as::
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment