比较字符串

0 投票
5 回答
9917 浏览
提问于 2025-04-16 13:28

在Python里,有没有什么内置的函数可以用来计算两个字符串中相同字符的数量?比如:

输入:

   TICK TOCK
   CAT DOG
   APPLE APPLES

输出:

 3
 0
 5

比如“TICK”和“TOCK”这两个词的得分是3,因为它们有三个相同的字符(T、C、K)。而“CAT”和“DOG”得分是0,因为没有任何字母是相同的。

我刚开始学Python,所以请给我一些例子帮助我理解。

5 个回答

1

如果字符的位置和顺序都很重要,那么选择的答案就可以解决问题。不过,如果情况不是这样,给出的解决方案就不管用了。

如果位置不重要,但顺序很重要,你可以写一个函数来返回最长公共子序列的长度。下面是一个示例实现:

def lcs(string1, string2):
    m = len(string1)
    n = len(string2)

    C = [[0] * (n + 1)] * (m + 1)
    for i in range(m + 1)[1:]:
        for j in range(n + 1)[1:]:
            if string1[i - 1] == string2[j - 1]:
                C[i][j] = C[i - 1][j - 1] + 1
            else:
                C[i][j] = max(C[i][j - 1], C[i - 1][j])
    return C[m][n]

如果位置和顺序都不重要,你可以使用collections.Counter(适用于Python 2.7/3.1;或者http://code.activestate.com/recipes/576611/)来处理,像这样:

def f(string1, string2):
    set_string1 = Counter(string1)
    set_string2 = Counter(string2)

    # get common characters
    common = set_string1 & set_string2

    # return the sum of the number of occurrences for each character
    return reduce(lambda a, b: a + b, common.values())
1

没有现成的函数可以直接使用。不过,你可以通过一些简单的表达式来实现这个功能。

>>> A, B = sorted("APPLE APPLES".split(), key=len)
>>> len([e for e in A if e in B])
5
6

这里有一个使用列表推导式的版本:

[x == y for (x, y) in zip("TICK", "TOCK")].count(True)

或者,更简洁一点(使用 operator):

import operator
map(operator.eq, "TICK", "TOCK").count(True)

根据 @Kabie 的说法,<expr>.count(True) 可以在这两个版本中用 sum(<expr>) 来替代。

撰写回答