如何确定两个字符串的相似程度(直到某一点)

How to Determine how similar two strings are (until a certain point)

我有一个字符串列表['49275', '49287', '69674', '43924']

我想看看它们与某个值有多相似(可以说 '49375' 但是一旦存在差异,超过差异的所有内容都需要算作不相似(即使它们是)

所以 '49375''49275' 的相似度应该是 0.4 而不是 0.8

我尝试了下面的代码,但我被难住了,一定有更好的方法。

l = ['49275', '49287', '69674', '43924']
x = '49375'

listy = []
for i in l:
  for n in range(len(x)):
    if x[n] == i[0][n]:
      listy.append((n+1)/len(x))
    if x[n] != i[0][n]:
      break

我希望输出是相似度数列表,即:[0.4, 0.4, 0, 0.2]

谢谢!

试试这个:

l = ['49275', '49287', '69674', '43924']
x = '49375'

listy = [0] * len(l)
for i, el in enumerate(l):
    for n in range(len(x)):
        if el[n] != x[n]: break
        listy[i] += 0.2

你很接近。您只想在字符 匹配的位置(即 break 之前)追加到 listy,或者如果循环完成时没有 break 然后追加 1.0.

另请注意,您需要 i[n] 而不是 i[0][n] - i[0][n] 给了您一个 IndexError 因为您正在使用第一个字符然后尝试使用n 中的字符。

l = ['49275', '49287', '69674', '43924']
x = '49375'

listy = []
for i in l:
    for n in range(len(x)):
        if x[n] != i[n]:
            listy.append(n / len(x))
            break
    else:
        listy.append(1.)

print(listy)
for n in range(len(x)):
    if x[n] == i[0][n]:
        listy.append((n+1)/len(x))
    if x[n] != i[0][n]:
        break

以上是您的基本问题:您将 每个 匹配字符的值附加到列表,而不仅仅是最后一个。另请注意,您重复了相等性测试;这是不必要的。进行两处更改:首先,只需将冗余测试替换为 else:

for n in range(len(x)):
    if x[n] == i[0][n]:
        listy.append((n+1)/len(x))
    else:
        break

其次,等到您退出此循环到 append 值。这将解决额外数据的问题。

实施留给学生作为练习。 :-)

from itertools import takewhile


def calc_similarity(l, x) -> list:
    similars = list()
    len_x = len(x)

    for item in l:
        a = list(takewhile(lambda ele: ele[1] == x[ele[0]], enumerate(item)))
        similars.append(len(a) / len_x)

    return similars

if __name__ == '__main__':
    l = ['49275', '49287', '69674', '43924']
    x = '49375'
    similarities = calc_similarity(l, x)
    print(similarities)

您可以使用 itertools 中的 takewhile

Return successive entries from an iterable as long as the predicate evaluates to true for each entry.

https://docs.python.org/3/library/itertools.html#itertools.takewhile

同样是枚举,第一个元素是index,第二个元素是value