# efficiently do weighted count the elements in the list

So I have a python dict like:

1:[ "red","blue","green"] 2: ["blue","blue","red"]..

and so on.

and then i have another python dict: score_dict = {

pid: weight 1: 2 2: 20 ... }

So, what i want is.. in the first dict, count number of times two colors occur together. and so on. But that count be multiplied by their weight.

For example:

I want to find out how many times red an blue occured together in this list:

so for pid 1 red and blue occurs once.

so this is (1*2) # 2 comes from the score_dict as pid1 has a weight 2

and then for second

there are two blue, red pairs I can form

so this is (1*20) + (1*20)

So total score for blue and red occuring together is 2 + 20 + 20 = 42

Also, how do i extend it to 3 colors?

Like if i have to find out "red" "blue" and " green" occuring together?

## Answers

from collections import Counter dict1 = {1:[ "red","blue","green"], 2: ["blue","blue","red"]} weight = {1: 2, 2: 20} score = 0 for k,v in dict1.iteritems(): score += weight[k] * Counter(v)["red"] * Counter(v)["blue"]

Result:

>>> score 42

The last part of my code could be rewritten as generator comprehension:

score = sum(weight[k] * Counter(v)["red"] * Counter(v)["blue"] for k,v in dict1.iteritems())

Not sure I fully understood but here's an idea:'

from collections import Counter data = { 1: ['red','blue','green'], 2: ['blue','blue','red'], } weights = { 1: 2, 2: 20, } for k, v in data.items(): score = sum([c * weights[k] for c in Counter(v).values()]) print "so this is: %s val = %d" % (k, score)