如何解决如何确定两个字符串的相似程度直到特定点
我有一个字符串列表['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
同时枚举,第一个元素是索引,第二个元素是值