related lists mean value
Steve Howell
showell30 at yahoo.com
Tue Mar 9 16:21:15 CET 2010
On Mar 8, 6:39 pm, John Posner <jjpos... at optimum.net> wrote:
> On 3/8/2010 5:34 PM, dimitri pater - serpia wrote:
>
> > Hi,
>
> > I have two related lists:
> > x = [1 ,2, 8, 5, 0, 7]
> > y = ['a', 'a', 'b', 'c', 'c', 'c' ]
>
> > what I need is a list representing the mean value of 'a', 'b' and 'c'
> > while maintaining the number of items (len):
> > w = [1.5, 1.5, 8, 4, 4, 4]
>
> > I have looked at iter(tools) and next(), but that did not help me. I'm
> > a bit stuck here, so your help is appreciated!
>
> Nobody expects object-orientation (or the Spanish Inquisition):
>
Heh. Yep, I avoided OO for this. Seems like a functional problem.
My solution is functional on the outside, imperative on the inside.
You could add recursion here, but I don't think it would be as
straightforward.
def num_dups_at_head(lst):
assert len(lst) > 0
val = lst[0]
i = 1
while i < len(lst) and lst[i] == val:
i += 1
return i
def smooth(x, y):
result = []
while x:
cnt = num_dups_at_head(y)
avg = sum(x[:cnt]) * 1.0 / cnt
result += [avg] * cnt
x = x[cnt:]
y = y[cnt:]
return result
> #-------------------------
> from collections import defaultdict
>
> class Tally:
> def __init__(self, id=None):
> self.id = id
> self.total = 0
> self.count = 0
>
> x = [1 ,2, 8, 5, 0, 7]
> y = ['a', 'a', 'b', 'c', 'c', 'c']
>
> # gather data
> tally_dict = defaultdict(Tally)
> for i in range(len(x)):
> obj = tally_dict[y[i]]
> obj.id = y[i]
> obj.total += x[i]
> obj.count += 1
>
> # process data
> result_list = []
> for key in sorted(tally_dict):
> obj = tally_dict[key]
> mean = 1.0 * obj.total / obj.count
> result_list.extend([mean] * obj.count)
> print result_list
> #-------------------------
More information about the Python-list
mailing list