Python中+Counter的作用、原理及相关一元运算符先例问询
聊聊
collections.Counter的一元正负号玩法 一、+c为啥能清掉零和负计数?它到底是啥?
你看到的+c其实是Python运算符重载的玩法——它会直接调用Counter类里的__pos__()方法,也就是c.__pos__()的语法糖。这个方法内部逻辑很简单:遍历计数器里的所有键值对,只留下计数为正的条目,自动删掉零和负计数的,最后返回一个新的Counter实例。
举个实际例子一看就懂:
from collections import Counter c = Counter(a=3, b=-2, c=0, d=1) print(+c) # 结果是 Counter({'a': 3, 'd': 1})
二、-c的逻辑同理
-c对应的是Counter的__neg__()方法,它的作用是:只保留原计数器里负计数的条目,把这些条目的计数翻转为正,同时删掉正计数和零计数的内容。比如上面的例子里:
print(-c) # 结果是 Counter({'b': 2})
三、这种一元运算符用法有先例吗?
当然有,这不是Counter独创的,Python本身就支持自定义类重载一元运算符:
- 最基础的数值类型就用了:比如
+5本质是(5).__pos__(),-3是(3).__neg__(),只不过数值的这些方法逻辑很直观,就是返回自身或相反数。 - 第三方库也常用:比如numpy数组,
+arr会返回数组副本,-arr会把每个元素取反;还有一些自定义的向量、矩阵类,会用一元负号实现向量取反的逻辑。
说白了,Python允许类通过实现__pos__、__neg__这类特殊方法,给一元正负号赋予自定义语义。Counter只是把这个机制拿来用,给正负号加了清理计数器的功能,虽然看起来有点反直觉,但完全符合Python的规则。
内容的提问来源于stack exchange,提问作者feetwet
相关产品推荐
相关产品推荐

