returns a generator which returns combinations of argument sequences for example xcombine((1,2),(3,4)) returns a generator; calling the next() method on the generator will return [1,3], [1,4], [2,3], [2,4] and StopIteration exception. This will not create the whole list of combinations in memory at
(*seqin)
| 1 | import itertools |
| 2 | def xcombine(*seqin): |
| 3 | '''returns a generator which returns combinations of argument sequences |
| 4 | for example xcombine((1,2),(3,4)) returns a generator; calling the next() |
| 5 | method on the generator will return [1,3], [1,4], [2,3], [2,4] and |
| 6 | StopIteration exception. This will not create the whole list of |
| 7 | combinations in memory at once.''' |
| 8 | def rloop(seqin,comb): |
| 9 | '''recursive looping function''' |
| 10 | if seqin: # any more sequences to process? |
| 11 | for item in seqin[0]: |
| 12 | newcomb=comb+[item] # add next item to current combination |
| 13 | # call rloop w/ remaining seqs, newcomb |
| 14 | for item in rloop(seqin[1:],newcomb): |
| 15 | yield item # seqs and newcomb |
| 16 | else: # processing last sequence |
| 17 | yield comb # comb finished, add to list |
| 18 | return rloop(seqin,[]) |
| 19 | |
| 20 | def cartn(sequence, n): |
| 21 | tocombine=list(itertools.repeat(sequence,n)) |