python - 比较两个不同的 python 计数器对象
问题描述
我正在研究 Python 中的一种算法,该算法将接受用户输入并告诉他们需要将哪些新字母添加到字符串中以使其成为不同的字符串,并且我一直在使用由计数器方法。
我想比较两个不同的字典,它们从字符串中计算字母(比如使用集合模块中的计数器工具返回的对象)。我们可以将这些字典称为 D1 和 D2。我希望有两个结果字典(R1 和 R2),第一个是两者之间的共享字母,第二个是将 R1 变为 R2 所需的字母(在 D2 中但不在 D1 中的字母)。
例如:
# assuming they’ve been converted from counter objects into regular
dictionaries #
D1 = {‘A’: 2, ‘B’: 1, ‘C’: 4, ‘D’: 5}
D2 = {‘A’: 3, ‘B’: 4, ‘C’ : 4, ‘D’: 7}
# Some sort of comparison function executed here #
结果:
R1={‘A’: 2, ‘B’: 3, ‘C’: 4, ‘D’: 5}
R2 = {‘A’: 1, ‘B’: 1, ‘C’: 0 , ‘D’: 2}
解决方案
如果共享字母是指 Counter 交集,则可以使用&
运算符,需要转换R1
成的字母数量R2
可以看作是差异:
from collections import Counter
D1 = Counter({'A': 2, 'B': 1, 'C': 4, 'D': 5})
D2 = Counter({'A': 3, 'B': 4, 'C': 4, 'D': 7})
R1 = D1 & D2
print(R1) # intersection: min(c[x], d[x])
print(D2 - D1) # subtract (keeping only positive counts)
输出
Counter({'D': 5, 'C': 4, 'A': 2, 'B': 1})
Counter({'B': 3, 'D': 2, 'A': 1})
如果你想保持负数,你可以这样做:
from collections import Counter
D1 = Counter({'A': 2, 'B': 1, 'C': 4, 'D': 5, 'E': 5})
D2 = Counter({'A': 3, 'B': 4, 'C': 4, 'D': 7, 'E': 3})
R2 = Counter({key: D2.get(key, 0) - value for key, value in D1.items()})
print(R2)
输出
Counter({'B': 3, 'D': 2, 'A': 1, 'C': 0, 'E': -2})
在上面的例子'E' : -2
中,因为计数E
是5
inD1
和3
in D2
。注意:所有示例都在 Python 3.5 中。
推荐阅读
- laravel - 当我在 Laravel 中更改主键时,SoftDelete 不起作用
- c# - 如何将十六进制字符串和十六进制字符串和十六进制字符串中的十进制值转换为字节
- web-services - 如何从外部的节点 js 客户端访问暴露的 BluePrism Web 服务
- android - MediaRecorder.AudioSource 中 VOICE_CALL 和 VOICE_COMMUNICATION 的区别
- docker - Kubernetes 中 NodePort 类型服务的 Pod 到 Pod 通信
- laravel - 将数据表添加到 laravel 混合文件
- mysql - SQL - 使用带有日期参数的查询,其中 IN 用于子查询
- python - 我如何获得与 keras 重合的百分比
- android - 如何通过Android中的通话功能实现OTP?
- java - 从 JSON 字符串中删除双引号