比较两个不同的python计数器对象

问题描述 投票:1回答:4

我正在研究Python中的算法,该算法将接受用户输入并告诉他们需要将新字母添加到字符串中以使其成为不同的字符串,并且我一直在玩由字典创建的字典。反方法。

我想比较两个不同的字典来计算字符串中的字母(比如从collections模块中使用Counter工具返回的对象)。我们可以将这些词典称为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} 
python algorithm comparison counter string-comparison
4个回答
4
投票

如果您使用共享字母表示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中的D13中的D2。注意:所有示例都在Python 3.5中。


3
投票

这些操作已经内置到Counter类型:

提供了几个数学运算来组合Counter对象以生成多个集合(计数大于零的计数器)。加法和减法通过添加或减去相应元素的计数来组合计数器。交点和并集返回相应计数的最小值和最大值。

(引自qazxsw poi。)

因此,假设Python collections.Counter docsD1是计数器,请尝试

D2

1
投票
R1 = D1 & D2
R2 = D2 - R1

这给出了D1和D2计数器的共同内容


0
投票

我无法理解这个问题,但根据我的理解:

IntersectCounter=[]
for each in D1:
        if D1[each]==D2[each]:
              IntersectCounter.append(each)

结果

R1 = {k: min(v, D2[k]) for k, v in D1.items()}
R2 = {k: abs(v - D2[k]) for k, v in D1.items()}
© www.soinside.com 2019 - 2024. All rights reserved.