Python 比较字符串中字符的出现情况

Python 比较字符串中字符的出现情况,python,comparison,Python,Comparison,我正在尝试编写一个jottoScore函数,该函数将接收两个字符串,并返回两个字符串之间共享的字符出现次数 也就是说,jottoScore'maat',caat'应该返回3,因为有两个As被共享,一个T被共享 我觉得这是一个足够简单的独立练习问题,但我不知道如何迭代字符串,并比较每个字符已经按字母顺序排列的字符串 如果它们已排序且顺序重要: >>> a = "maat" >>> b = "caat" >>> sum(1 for c1,c2 i

我正在尝试编写一个jottoScore函数,该函数将接收两个字符串,并返回两个字符串之间共享的字符出现次数

也就是说,jottoScore'maat',caat'应该返回3,因为有两个As被共享,一个T被共享


我觉得这是一个足够简单的独立练习问题,但我不知道如何迭代字符串,并比较每个字符已经按字母顺序排列的字符串

如果它们已排序且顺序重要:

>>> a = "maat"
>>> b = "caat"
>>> sum(1 for c1,c2 in zip(a,b) if c1==c2)
3

如果它们已排序且顺序重要:

>>> a = "maat"
>>> b = "caat"
>>> sum(1 for c1,c2 in zip(a,b) if c1==c2)
3

如果您使用的是Python2.7+,那么我将采用以下方法:

from collections import Counter

def jotto_score(str1, str2):
    count1 = Counter(str1)
    count2 = Counter(str2)
    return sum(min(v, count2.get(k, 0)) for k, v in count1.items())

print jotto_score("caat", "maat")
print jotto_score("bigzeewig", "ringzbuz")
输出


如果您使用的是Python2.7+,那么我将采用以下方法:

from collections import Counter

def jotto_score(str1, str2):
    count1 = Counter(str1)
    count2 = Counter(str2)
    return sum(min(v, count2.get(k, 0)) for k, v in count1.items())

print jotto_score("caat", "maat")
print jotto_score("bigzeewig", "ringzbuz")
输出

编辑:此解决方案不考虑字符是否位于字符串中的同一索引或字符串是否具有相同的长度

编辑:此解决方案不考虑字符是否位于字符串中的相同索引或字符串是否具有相同的长度。

的简化版本

简化版的


你说的匹配字符是什么意思?在两个字符串中的位置是否应相同?如果不清楚您想要什么,就不可能知道如何解决您的问题。aat和maat或taa和matIt的答案应该是什么似乎字符必须相同,并且在相同的索引中,但OP已经说过字符串正在排序,所以,也许它们只是需要有相同的索引@请澄清。你所说的匹配字符是什么意思?在两个字符串中的位置是否应相同?如果不清楚您想要什么,就不可能知道如何解决您的问题。aat和maat或taa和matIt的答案应该是什么似乎字符必须相同,并且在相同的索引中,但OP已经说过字符串正在排序,所以,也许它们只是需要有相同的索引@泰森萨桑:请澄清。不需要理解列表。在zipa中使用c1和c2的genexp:sum1,如果c1==c2,则使用b。但是请注意,这在很大程度上取决于顺序,例如,如果a=测试,b=测试,则答案为0而不是3,这可能是OP想要的,也可能不是OP想要的。否。对于“mata”和“caat”,这不会给出OP想要的正确答案。@sberryNo不需要理解列表。在zipa中使用c1和c2的genexp:sum1,如果c1==c2,则使用b。但是请注意,这在很大程度上取决于顺序,例如,如果a=测试,b=测试,则答案为0而不是3,这可能是OP想要的,也可能不是OP想要的。否。对于'mata'和'caat',这不会给出OP想要的正确答案。@sberryWhy您递归地需要它?这将是一个开销,但我认为您可以在进入递归时pas string_a[1:],如果不是string_a或不是string_b,则递归的退出条件应为pe:返回。还有一些变化。。应将for更改为一个简单的if,以检查string_b中的string_a[0]。。。必须保留对函数的每次返回,以便您可以在末尾添加计数。为什么需要递归?这将是一项开销,但我认为您可以在进入递归时使用string_a[1:],如果不是string_a或string_b:return,则递归的退出条件应为pe。还有一些变化。。应将for更改为一个简单的if,以检查string_b中的string_a[0]。。。每次返回函数都必须保留,以便在末尾添加计数。
def chars_occur(string_a, string_b):
    list_a, list_b = list(string_a), list(string_b) #makes a list of all the chars
    count = 0
    for c in list_a:
        if c in list_b:
            count += 1
            list_b.remove(c)
    return count
from collections import Counter

def jotto_score(str1, str2):
    return sum((Counter(str1) & Counter(str2)).values())