title: How to normalize a Counter and combine 2 normalized Counters? - python
body: <p>Firstly, I have two list of strings:</p>
  
  <pre><code>['abc','abc','def','jkl']
  ['abc','def','def','pqr', 'pr', 'foo', 'bar']
  </code></pre>
  
  <p>And then I need counters of the lists that are normalized such that the sum of the values in each counter equals 1:</p>
  
  <pre><code>Counter({'abc': 0.8164965809277261, 'jkl': 0.4082482904638631, 'def': 0.4082482904638631})
  Counter({'abc': 1.1498299142610595, 'def': 1.0749149571305296, 'jkl': 0.4082482904638631, 'pr': 0.3333333333333333, 'bar': 0.3333333333333333, 'pqr': 0.3333333333333333, 'foo': 0.3333333333333333})
  </code></pre>
  
  <p>The normalizing factor is </p>
  
  <pre><code>math.sqrt(sum(i*i for i in counter.values()))
  </code></pre>
  
  <p>I've tried the following by iterating throw the counter keys but is there any other way of achieving the say <code>x+y</code> Counter?</p>
  
  <pre><code>&gt;&gt;&gt; from collections import Counter
  &gt;&gt;&gt; import math
  &gt;&gt;&gt; x = Counter(['abc','abc','def','jkl'])
  &gt;&gt;&gt; denominator = 1/math.sqrt(sum(math.pow(i,2) for i in x.values()))
  &gt;&gt;&gt; for i in x:
  ...     x[i]*=denominator
  ... 
  &gt;&gt;&gt; x
  Counter({'abc': 0.8164965809277261, 'jkl': 0.4082482904638631, 'def': 0.4082482904638631})
  &gt;&gt;&gt; y = Counter(['abc','def','def','pqr', 'pr', 'foo', 'bar'])
  &gt;&gt;&gt; denominator2 = 1/math.sqrt(sum(math.pow(i,2) for i in y.values()))
  &gt;&gt;&gt; for i in y:
  ...     y[i]*=denominator2
  ... 
  &gt;&gt;&gt; y
  Counter({'def': 0.6666666666666666, 'pr': 0.3333333333333333, 'abc': 0.3333333333333333, 'bar': 0.3333333333333333, 'pqr': 0.3333333333333333, 'foo': 0.3333333333333333})
  &gt;&gt;&gt; x+y
  Counter({'abc': 1.1498299142610595, 'def': 1.0749149571305296, 'jkl': 0.4082482904638631, 'pr': 0.3333333333333333, 'bar': 0.3333333333333333, 'pqr': 0.3333333333333333, 'foo': 0.3333333333333333})
  </code></pre>