两个字符串中的普通字母数

2024-09-30 08:21:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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

解决方案试图找出两个字符串中的共同字母的数量(相同的字母仍然在计算)。我的问题是,我开发了这个逻辑,但我担心它可能是一个轮子的重新发明。有什么介绍的方法,或者更简单的方法吗?在

注意:我的问题不同于那些试图在字符串之间找到普通字母的问题,我只需要计数,这样我就可以找到一些基本的东西。在


Tags: 方法key字符串answerfromimportfor字母
3条回答

IMHO略好于Frerich Raabe good answer(我没有看到,这个答案是从一个重复的问题中迁移过来的),我会使用经典的collections.Counter计算两个字符串中的字母,然后在字典之间执行最小函数(如果字母不在第二个dict中,访问它将返回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()可以保存对第一个计数器字典的一键访问。在

这是在一次采访中问我的。 有更好的方法。 数到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))

不,据我所知,你没有重新发明轮子。你的解决方案已经很简洁了。您可以使用sum函数将代码缩短一点,然后将其放入一个专用函数中,以强调简单性:

def num_common_letters(a, b):
    ac = Counter(a)
    bc = Counter(b)
    return sum(min(ac[key], bc[key]) for key in ac)

这里没什么可脱光的。在

相关问题 更多 >

    热门问题