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