首页 > 解决方案 > 比较两个不同的 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} 

标签: pythonalgorithmcomparisoncounterstring-comparison

解决方案


如果共享字母是指 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中,因为计数E5inD13in D2注意:所有示例都在 Python 3.5 中。


推荐阅读