python乘以两个集合计数器

时间:2016-03-01 10:44:33

标签: python collections counter dot-product python-collections

Python集合计数器 好奇,如果有更好的方法来做到这一点。重写Counter类方法? 内置乘法产生两个计数器的点积

from collections import Counter
a = Counter({'b': 4, 'c': 2, 'a': 1})
b = Counter({'b': 8, 'c': 4, 'a': 2})    
newcounter = Counter()
for x in a.elements():
    for y in b.elements():
        if x == y:
             newcounter[x] = a[x]*b[y]

$ newcounter
Counter({'b': 32, 'c': 8, 'a': 2})

3 个答案:

答案 0 :(得分:6)

假设ab始终具有相同的键,您可以使用字典理解来实现此目的:

a = Counter({'b': 4, 'c': 2, 'a': 1})
b = Counter({'b': 8, 'c': 4, 'a': 2})
c = Counter({k:a[k]*b[k] for k in a})
print(c)

<强>输出

Counter({'b': 32, 'c': 8, 'a': 2})

答案 1 :(得分:3)

如果你没有相同的词组,你可以获得密钥的交集

from collections import Counter

a = Counter({'b': 4, 'c': 2, 'a': 1, "d":4})
b = Counter({'b': 8, 'c': 4, 'a': 2})

# just .keys() for python3
print Counter(({k: a[k] * b[k] for k in a.viewkeys() & b}))
Counter({'b': 32, 'c': 8, 'a': 2})

或者,如果你想加入两者,你可以使用dicts并使用dict.get:

from collections import Counter

a = Counter({'b': 4, 'c': 2, 'a': 1, "d":4})
b = Counter({'b': 8, 'c': 4, 'a': 2})


print Counter({k: a.get(k,1) * b.get(k, 1) for k in a.viewkeys() | b})
Counter({'b': 32, 'c': 8, 'd': 4, 'a': 2})

如果您希望能够在Counter dicts上使用*运算符,则必须自行滚动:

class _Counter(Counter):
    def __mul__(self, other):
        return _Counter({k: self[k] * other[k] for k in self.viewkeys() & other})

a = _Counter({'b': 4, 'c': 2, 'a': 1, "d": 4})
b = _Counter({'b': 8, 'c': 4, 'a': 2})

print(a * b)

哪会给你:

_Counter({'b': 32, 'c': 8, 'a': 2})

如果你想要到位:

from collections import Counter


class _Counter(Counter):
    def __imul__(self, other):
        return _Counter({k: self[k] * other[k] for k in self.viewkeys() & other})

输出:

In [28]: a = _Counter({'b': 4, 'c': 2, 'a': 1, "d": 4})

In [29]: b = _Counter({'b': 8, 'c': 4, 'a': 2})

In [30]: a *= b

In [31]: a
Out[31]: _Counter({'a': 2, 'b': 32, 'c': 8})

答案 2 :(得分:1)

这看起来好一点:

a = Counter({'b': 4, 'c': 2, 'a': 1})
b = Counter({'b': 8, 'c': 4, 'a': 2})    

newcounter = Counter({k:a[k]*v for k,v in b.items()})

>>> newcounter
Counter({'b': 32, 'c': 8, 'a': 2})