On Wed, 17 Feb 2010 10:10:37 -0800 (PST), Andrej Mitrovic wrote: [snip] > _num_frames = 32 > _frames = range(0, _num_frames) # This is a list of actual objects, > I'm just pseudocoding here. > _values = [0, 1, 2, 3, 4] > > I want to call a function of _frames for each frame with a _values > argument, but in a way to "spread out" the actual values. > > I would want something similar to the following to be called: > > _frames[0].func(_values[0]) > _frames[1].func(_values[0]) > _frames[2].func(_values[0]) > _frames[3].func(_values[0]) > _frames[4].func(_values[1]) > _frames[5].func(_values[1]) > _frames[6].func(_values[1]) > _frames[7].func(_values[1]) > _frames[8].func(_values[2]) > ...etc... > > Both the _values list and _frames list can be of variable and uneven > size, which is what is giving me the problems. I'm using Python 2.6. > > I've tried the following workaround, but it often gives me inaccurate > results (due to integer division), so I had to add a safety check: > > num_frames = 32 > values = [0, 1, 2, 3, 4] > offset_step = num_frames / len(values) > for index in xrange(0, num_frames): > offset = index / offset_step > if offset > offset_values[-1]: > offset = offset_values[-1] > frames[index].func(values[offset])
Here's my suggestion: Python 2.5.2 (r252:60911, Jul 22 2009, 15:35:03) >>> import math >>> import itertools >>> values = [ 1, 2, 3 ] >>> f = list( lambda x=i : x for i in range( 10 ) ) >>> n = int( math.ceil( len(f)/float( len(values) ) ) ) >>> for ff, dd in zip( f, itertools.chain(*zip( *n*[values] )) ): ... print "Function %d applied to data %d." % ( ff(dd), dd ) ... Function 1 applied to data 1. Function 1 applied to data 1. Function 1 applied to data 1. Function 1 applied to data 1. Function 2 applied to data 2. Function 2 applied to data 2. Function 2 applied to data 2. Function 2 applied to data 2. Function 3 applied to data 3. Function 3 applied to data 3. >>> -- To email me, substitute nowhere->spamcop, invalid->net. -- http://mail.python.org/mailman/listinfo/python-list