我使用collections Counter
使用此代码来查找两个字符串中的常用字母数。
from collections import Counter
a = "abcc"
b = "bcaa"
answer = 0
ac = Counter(a)
bc = Counter(b)
for key in ac:
answer += min(ac[key], bc[key])
print answer
解决方案试图找到两个字符串中常见字母的数量(仍然计算相同的字母)我的问题是,我开发了这个逻辑,但我担心它可能是一个轮子重新发明。是否有任何介绍的方法,或更简单的方法吗?
注意:我的问题与尝试查找字符串之间常见字母的问题不同,我只需要计算,所以我希望找到基本的东西。
答案 0 :(得分:1)
不,据我所知,你没有重新发明轮子。您的解决方案已经非常简洁。您可以使用sum
函数稍微缩短代码,然后将其放入专用函数中以强调简单性:
def num_common_letters(a, b):
ac = Counter(a)
bc = Counter(b)
return sum(min(ac[key], bc[key]) for key in ac)
在这里剥离并不多。
答案 1 :(得分:0)
IMHO稍微好于Frerich Raabe的好答案(我没有看到,这个答案已从一个重复的问题中迁移出来),我会使用经典collections.Counter
来计算来自两个字符串的字母,然后执行字典之间的最小功能(如果第二个字典中的字母不是,则访问它返回0,因此不需要在第二个字典中测试值)
导入集合
def common_character_count(s1,s2):
other_counter = collections.Counter(s2)
return (sum(min(v,other_counter[k]) for k,v in collections.Counter(s1).items()))
print(common_character_count("aabcc","adcaa"))
打印3
使用.items()
可以保存对第一个计数器字典的一键访问权。
答案 2 :(得分:0)
这是在接受采访时向我询问的。 有一种更好的方法。 取26个字符,然后取最小值。 这是完整的解决方案:
from astropy.extern.ply.cpp import xrange
def commoncharacters(a, b):
count1 = [0] * 26 ; count2 = [0] * 26
for i in a: count1[ord(i) - ord('a')] += 1 ;
for i in b: count2[ord(i) - ord('a')] += 1 ;
res = 0
for i in xrange(26):
res += min(count1[i], count2[i])
return res
# driver function
a = "giniProtijayi"
b = "ginikhepi"
print(commoncharacters(a, b))
答案 3 :(得分:-1)
要计算字符串中字母的出现次数,可以使用字典;
a = "abcc"
counter = {}
for key in a:
if key in counter:
counter[key]+=1
else:
counter[key]=1
计数器
{'a': 1, 'b': 1, 'c': 2}