如何使用 python 检查两个列表中的字符串是否几乎相等
How to check if strings in two list are almost equal using python
我试图在两个列表中找到几乎匹配的字符串。假设有如下两个列表
string_list_1 = ['apple_from_2018','samsung_from_2017','htc_from_2015','nokia_from_2010','moto_from_2019','lenovo_decommision_2017']
string_list_2 =
['apple_from_2020','samsung_from_2021','htc_from_2015','lenovo_decommision_2017']
Output
Similar = ['apple_from_2018','samsung_from_2017','htc_from_2015','lenovo_decommision_2017']
Not Similar =['nokia_from_2010','moto_from_2019']
我使用下面的实现尝试了上面的一个,但它没有给出正确的结果
similar = []
not_similar = []
for item1 in string_list_1:
for item2 in string_list_2:
if SequenceMatcher(a=item1,b=item2).ratio() > 0.90:
similar.append(item1)
else:
not_similar.append(item1)
当我尝试上面的实现时,它并不像预期的那样。如果有人能找出缺失的部分并获得所需的结果,我们将不胜感激
您可以使用以下函数来查找两个给定字符串之间的相似性
from difflib import SequenceMatcher
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
print(similar("apple_from_2018", "apple_from_2020"))
输出:
0.8666666666666667
因此使用此函数,您可以 select 超过百分比相似度阈值的字符串。尽管您可能需要将阈值从 90 降低到 85 才能获得预期的输出。
因此下面的代码应该可以正常工作
string_list_1 = ['apple_from_2018','samsung_from_2017','htc_from_2015','nokia_from_2010','moto_from_2019','lenovo_decommision_2017']
string_list_2 = ['apple_from_2020','samsung_from_2021','htc_from_2015','lenovo_decommision_2017']
from difflib import SequenceMatcher
similar = []
not_similar = []
for item1 in string_list_1:
# Set the state as false
found = False
for item2 in string_list_2:
if SequenceMatcher(None, a=item1,b=item2).ratio() > 0.80:
similar.append(item1)
found = True
break
if not found:
not_similar.append(item1)
print("Similar : ", similar)
print("Not Similar : ", not_similar)
输出:
Similar : ['apple_from_2018', 'samsung_from_2017', 'htc_from_2015', 'lenovo_decommision_2017']
Not Similar : ['nokia_from_2010', 'moto_from_2019']
这确实减少了时间和冗余追加。此外,由于 90 太高,我已将相似性度量降低到 80。但请随意调整这些值。
我试图在两个列表中找到几乎匹配的字符串。假设有如下两个列表
string_list_1 = ['apple_from_2018','samsung_from_2017','htc_from_2015','nokia_from_2010','moto_from_2019','lenovo_decommision_2017']
string_list_2 =
['apple_from_2020','samsung_from_2021','htc_from_2015','lenovo_decommision_2017']
Output
Similar = ['apple_from_2018','samsung_from_2017','htc_from_2015','lenovo_decommision_2017']
Not Similar =['nokia_from_2010','moto_from_2019']
我使用下面的实现尝试了上面的一个,但它没有给出正确的结果
similar = []
not_similar = []
for item1 in string_list_1:
for item2 in string_list_2:
if SequenceMatcher(a=item1,b=item2).ratio() > 0.90:
similar.append(item1)
else:
not_similar.append(item1)
当我尝试上面的实现时,它并不像预期的那样。如果有人能找出缺失的部分并获得所需的结果,我们将不胜感激
您可以使用以下函数来查找两个给定字符串之间的相似性
from difflib import SequenceMatcher
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
print(similar("apple_from_2018", "apple_from_2020"))
输出:
0.8666666666666667
因此使用此函数,您可以 select 超过百分比相似度阈值的字符串。尽管您可能需要将阈值从 90 降低到 85 才能获得预期的输出。
因此下面的代码应该可以正常工作
string_list_1 = ['apple_from_2018','samsung_from_2017','htc_from_2015','nokia_from_2010','moto_from_2019','lenovo_decommision_2017']
string_list_2 = ['apple_from_2020','samsung_from_2021','htc_from_2015','lenovo_decommision_2017']
from difflib import SequenceMatcher
similar = []
not_similar = []
for item1 in string_list_1:
# Set the state as false
found = False
for item2 in string_list_2:
if SequenceMatcher(None, a=item1,b=item2).ratio() > 0.80:
similar.append(item1)
found = True
break
if not found:
not_similar.append(item1)
print("Similar : ", similar)
print("Not Similar : ", not_similar)
输出:
Similar : ['apple_from_2018', 'samsung_from_2017', 'htc_from_2015', 'lenovo_decommision_2017']
Not Similar : ['nokia_from_2010', 'moto_from_2019']
这确实减少了时间和冗余追加。此外,由于 90 太高,我已将相似性度量降低到 80。但请随意调整这些值。