Python比较两个字符串

时间:2014-02-10 21:03:01

标签: python

是否有一个函数来比较两个字符串(相同长度)的字符数有多少?我的意思是只换人。例如,AAA与AAT相差1个字符。

4 个答案:

答案 0 :(得分:4)

这将有效:

>>> str1 = "AAA"
>>> str2 = "AAT"
>>> sum(1 for x,y in enumerate(str1) if str2[x] != y)
1
>>> str1 = "AAABBBCCC"
>>> str2 = "ABCABCABC"
>>> sum(1 for x,y in enumerate(str1) if str2[x] != y)
6
>>>

上述解决方案使用sumenumerategenerator expression


由于True可以评估为1,您甚至可以这样做:

>>> str1 = "AAA"
>>> str2 = "AAT"
>>> sum(str2[x] != y for x,y in enumerate(str1))
1
>>>

但我个人更喜欢第一种解决方案,因为它更清晰。

答案 1 :(得分:3)

这是zip函数的一个很好的用例!

def count_substitutions(s1, s2):
    return sum(x != y for (x, y) in zip(s1, s2))

用法:

>>> count_substitutions('AAA', 'AAT')
1

来自文档:

zip(...)
    zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]

    Return a list of tuples, where each tuple contains the i-th element
    from each of the argument sequences.  The returned list is truncated
    in length to the length of the shortest argument sequence.

答案 2 :(得分:1)

根据poke所说的建议我建议使用jellyfish包。它有几个距离测量,就像你要求的那样。文档中的示例:

IN [1]: jellyfish.damerau_levenshtein_distance('jellyfish', 'jellyfihs')
OUT[1]: 1

或使用您的示例:

IN [2]: jellyfish.damerau_levenshtein_distance('AAA','AAT')
OUT[2]: 1

这将适用于许多不同的字符串长度,并且应该能够处理你投入的大部分内容。

答案 3 :(得分:1)

类似于simon的答案,但是您不必为了在结果元组上调用函数而压缩事物,因为这是map无论如何都要做的事情(以及Python 2中的itertools.imap)。 !=operator有一个方便的功能。因此:

sum(map(operator.ne, s1, s2))