Generating all combinations
pataphor
pataphor at gmail.com
Mon Jun 1 11:11:00 EDT 2009
Johannes Bauer wrote:
> Any help is appreciated!
This is on the fringe of exploitation, but hey, maybe the code helps you
think about the algorithm.
IMHO the following code is a glaring complaint about the injustice of
omission itertools inflicts on the perfectly natural and obvious
procedure of repeat_each (whatever it's name ought to be):
from itertools import izip, islice, cycle
def repeat_each(seq,n):
while True:
for x in seq:
for i in range(n):
yield x
def repeat_all(seq,n):
while True:
for i in range(n):
for x in seq:
yield x
def product(X):
N = []
total = 1
for x in X:
N.append(total)
total *= len(x)
R = [repeat_all(repeat_each(x,k),n)
for x,k,n in izip(X,N,reversed(N))]
return islice(izip(*R),total)
def test1():
L = ['a', 'bc','def' ]
for x in product(L):
print x
print
def test2():
repeat_all = cycle
test1()
if __name__ == '__main__':
test1()
test2()
See? Repeat_all and repeat_each are almost brothers, just separated by
the tiniest rearrangement of their genetic code (or should I say code
genetics?). Yet one is included as 'itertools.cycle' and the other is
doomed to live in limbo. Such injustice! Can it be that
'itertools.repeat' has usurped repeat_each's rightful position?
P.
More information about the Python-list
mailing list