如何确定两个字符串的相似程度(直到某一点)
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
我有一个字符串列表['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