回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>首先,我有两个字符串列表:</p>
<pre><code>['abc','abc','def','jkl']
['abc','def','def','pqr', 'pr', 'foo', 'bar']
</code></pre>
<p>然后我需要列表的计数器,这些计数器是标准化的,以便每个计数器中的值之和等于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>标准化因子是</p>
<pre><code>math.sqrt(sum(i*i for i in counter.values()))
</code></pre>
<p>我已经通过迭代抛出计数器键尝试了下面的方法,但是有没有其他方法可以实现say<code>x+y</code>计数器?</p>
<pre><code>>>> from collections import Counter
>>> import math
>>> x = Counter(['abc','abc','def','jkl'])
>>> denominator = 1/math.sqrt(sum(math.pow(i,2) for i in x.values()))
>>> for i in x:
... x[i]*=denominator
...
>>> x
Counter({'abc': 0.8164965809277261, 'jkl': 0.4082482904638631, 'def': 0.4082482904638631})
>>> y = Counter(['abc','def','def','pqr', 'pr', 'foo', 'bar'])
>>> denominator2 = 1/math.sqrt(sum(math.pow(i,2) for i in y.values()))
>>> for i in y:
... y[i]*=denominator2
...
>>> y
Counter({'def': 0.6666666666666666, 'pr': 0.3333333333333333, 'abc': 0.3333333333333333, 'bar': 0.3333333333333333, 'pqr': 0.3333333333333333, 'foo': 0.3333333333333333})
>>> 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>