python将两个收集计数器相乘
Python收集计数器 我很好奇是否有更好的方法。重写计数器类方法? 内置乘法器产生两个计数器的点积python将两个收集计数器相乘,python,collections,counter,dot-product,python-collections,Python,Collections,Counter,Dot Product,Python Collections,Python收集计数器 我很好奇是否有更好的方法。重写计数器类方法? 内置乘法器产生两个计数器的点积 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 =
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})
假设
a
和b
始终具有相同的键,您可以通过字典理解实现这一点,如下所示:
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})
如果没有相同的DICT,则可以获得关键点的交点:
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})
或者,如果您想同时加入,您可以使用dict或dict并使用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})
如果您想在计数器上使用*运算符,您必须自己滚动:
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})
这似乎好一点:
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})
呸,是的,我想我最好删除这条评论,以免混淆其他人。self.viewkeys()可能就是我想要的。谢谢我的重写mul方法的第一个版本没有改变对象。不用担心,无论哪里有
collections
或itertools
您都可以在dict view对象上使用多个set操作:)请注意,迭代.elements()
会以任意顺序生成元素。除非a.elements()
恰好与b.elements()
相同,否则结果将毫无意义。您可能希望迭代排序(a.keys()),然后计算a[key]*b[key]
建议您将示例更改为b=Counter({'c':4'a':2'b':8})
,以强调这一点。