Traversing through variable-sized lists
Peter Pearson
ppearson at nowhere.invalid
Wed Feb 17 14:15:05 EST 2010
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.
More information about the Python-list
mailing list