two generators working in tandem
Michael Spencer
mahs at telcopartners.com
Fri Feb 10 17:19:05 EST 2006
john peter wrote:
> I'd like to write two generators: one is a min to max sequence number generator that
> rolls over to min again once the max is reached. the other is a generator that cycles
> through N (say, 12) labels. currently, i'm using these generators in nested loops like
> this:
>
> seq_numbers = genSeqNum(min,max)
> for label in genLabel():
> for some_date in genDate(init):
> for i in xrange(0, LIMIT):
> print label, some_date, i, seq_numbers.next()
>
> The problem I'm trying to solve is this:
> when the seq_numbers generator rolls over, the label generator must be advanced
> to the next one "in tandem". does anyone has any suggestion? thanks for any hepl!
>
>
> ---------------------------------
> Yahoo! Mail
> Use Photomail to share photos without annoying attachments.
>
This returns an iterator that 'nests' an arbitrary number of sequences
(odometer-style).
def nest(*sequences):
def _nest(outer, inner):
for outer_item in outer:
if not isinstance(outer_item, tuple):
outer_item = (outer_item,)
for inner_item in inner:
yield outer_item + (inner_item,)
return reduce(_nest, sequences)
So, for your use case:
>>> seq_numbers = range(1,10)
>>> labels = ["A","B","C"]
>>> list(nest(labels, seq_numbers))
[('A', 1), ('A', 2), ('A', 3), ('A', 4), ('A', 5), ('A', 6), ('A', 7), ('A',
8), ('A', 9), ('B', 1), ('B', 2), ('B', 3), ('B', 4), ('B', 5), ('B', 6), ('B',
7), ('B', 8), ('B', 9), ('C', 1), ('C', 2), ('C', 3), ('C', 4), ('C', 5), ('C',
6), ('C', 7), ('C', 8), ('C', 9)]
>>>
HTH, Michael
More information about the Python-list
mailing list