Traversing through variable-sized lists

Wolfram Hinderer wolfram.hinderer at googlemail.com
Wed Feb 17 14:15:59 EST 2010


On 17 Feb., 19:10, Andrej Mitrovic <andrej.mitrov... at gmail.com> wrote:
> Hi,
>
> I couldn't figure out a better description for the Subject line, but
> anyway, I have the following:
>
> _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])
>
> There has to be a better way to do this. I'd appreciate any help.
> Cheers!

Python 3.1:
>>> def apply_spreaded(funcs, values):
...     num_funcs = len(funcs)
...     num_values = len(values)
...     for i, func in enumerate(funcs):
...         func(values[(i * num_values) // num_funcs])

>>> apply_spreaded([print] * 8, range(5))
0
0
1
1
2
3
3
4




More information about the Python-list mailing list