如何确定两个字符串的相似程度直到特定点

问题描述

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

我想查看它们与某个值的相似程度(让我们说'49375',但一旦存在差异,则超出差异的所有内容都应视为不相似(即使它们相似)

因此'49375''49275'的相似度应为0.4 NOT 0.8

我尝试了下面的代码,但是我很困惑,必须有更好的方法

l = ['49275','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.2]

谢谢!

解决方法

尝试一下:

RewriteRule ^foo/(.*)$ /bar/$1 [R=307,NC,L]

RewriteRule ^bar/baz/(.*)$ foo/$1 [NC,END]
RewriteRule ^bar/(.*)$ foo/$1 [NC,END]
,

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

还请注意,您想要i[n]而不是i[0][n]-i[0][n]给您IndexError的原因是您先是第一个字符,然后又是{ {1}}。

n
,
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中使用获取时间

从谓词中返回连续项,只要谓词 每个条目的计算结果为true。

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

同时枚举,第一个元素是索引,第二个元素是值