两个字符串中的常用字母数

时间:2016-05-04 11:04:31

标签: python set venn-diagram

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

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

注意:我的问题与尝试查找字符串之间常见字母的问题不同,我只需要计算,所以我希望找到基本的东西。

4 个答案:

答案 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}