On Jun 1, 10:11 am, pataphor <patap...@gmail.com> wrote: > 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):
I believe the name you're looking for is combinations_with_replacement. It is one of the features being added to 3.1 which should give all the subsets of the Cartesian Product: permutations_with_replacement: product() combinations_with_replacement: combinations_with_replacement() permutations_without_replacement: permutations() combinations_without_replacement: combinations() > > 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. -- http://mail.python.org/mailman/listinfo/python-list