Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python匹配两个字符串(字符对字符),直到第一个不匹配为止_Python_String Matching - Fatal编程技术网

使用python匹配两个字符串(字符对字符),直到第一个不匹配为止

使用python匹配两个字符串(字符对字符),直到第一个不匹配为止,python,string-matching,Python,String Matching,我正在尝试按顺序匹配两个字符串,直到第一个字符串包含不匹配的字符,然后确定精确匹配的百分比。我的代码如下: def match(a, b): a, b = list(a), list(b) count = 0 for i in range(len(a)): if (a[i]!= b[i]): break else: count = count + 1 return count/len(a) a = '354575368987943

我正在尝试按顺序匹配两个字符串,直到第一个字符串包含不匹配的字符,然后确定精确匹配的百分比。我的代码如下:

def match(a, b):
    a, b = list(a), list(b)
    count = 0
    for i in range(len(a)):
        if (a[i]!= b[i]): break
        else: count = count + 1
    return count/len(a)

a = '354575368987943'
b = '354535368987000'
c = '354575368987000'
print(match(a,b)) # return 0.267
print(match(a,c)) # return 0.8

python中是否已经有任何内置方法可以更快地完成此任务?为简单起见,假设两个字符串的长度相同。

我认为没有这种内置方法

但您可以改进您的实现:

  • 无需将输入包装在
    列表(…)
    中。弦是可转位的
  • 不需要
    count
    变量,
    i
    已经具有相同的含义。当你知道结果后,你可以立即返回
像这样,加上一些博士学位作为奖励:

def match(a, b):
    """
    >>> match('354575368987943', '354535368987000')
    0.26666666666666666

    >>> match('354575368987943', '354575368987000')
    0.8

    >>> match('354575368987943', '354575368987943')
    1
    """
    for i in range(len(a)):
        if a[i] != b[i]:
            return i / len(a)

    return 1

没有内置函数来完成整个操作,但您可以使用内置函数来计算公共前缀:

import os
def match(a, b):
    common = os.path.commonprefix([a, b])
    return float(len(common))/len(a)    
可供替代的 (刚才看到我下面的答案在我编辑帖子时想到了同样的事情)


很好的发现!最接近这一点的是
difflib
:字符串可以作为列表进行操作,不需要
list()
它们。注释中已经提供了最好的答案,也可以签出
def match(l1, l2):
    # find mismatch
    try:
        stop = next(i for i, (el1, el2) in enumerate(zip(l1, l2)) if el1 != el2)
        return stop/len(l1)
    except StopIteration:
        return 1