比较字符串
在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>)
来替代。