python - 根据相似性替换字符串

标签 python string str-replace string-comparison

我正在尝试用另一个列表中的字符串替换一个列表中的字符串。

strlist = ['D-astroid 3-cyclone', 'DL-astroid 3-cyclone', 'DL-astroid', 'D-comment', 'satellite']
to_match = ['astroid 3-cyclone', 'D-comment', 'D-astroid']

预期输出:

str_list = ['astroid 3-cyclone', 'astroid 3-cyclone', 'D-astroid', 'D-comment', 'satellite']

并且还输出包含映射的字典

dict = 
{'astroid 3-cyclone':['astroid 3-cyclone', 'astroid 3-cyclone'],
'D-comment':'D-comment',
'D-astroid':'DL-astroid',
}

我正在尝试使用 difflib 以以下方式针对测试用例实现它,

from difflib import SequenceMatcher
from pprint import pprint


def similar(a, b):
    return SequenceMatcher(None, a, b).ratio()


strlist = ['D-astroid 3-cyclone', 'DL-astroid 3-cyclone', 'DL-astroid', 'D-comment']
to_match = ['astroid 3-cyclone', 'D-comment', 'D-astroid']
similarity = similar('DL-astroid', 'astroid 3-cyclone')
pprint(similarity)

基本上,如果相似度匹配高于 0.9 或 0.85,则 strlist 中的字符串必须替换为 to_match 列表中的字符串。可以使用两个 for 循环来检查 strlist 中的项目与 to_match 中的项目是否具有较高的相似度(>0.9)。我不确定这是否是一种有效的实现方式。

有什么建议吗?

编辑:我的尝试,但我不确定如何创建字典。

from difflib import SequenceMatcher
from pprint import pprint
def similar(a, to_match):
    percent_similarity = [SequenceMatcher(None, a, b).ratio() for b in to_match]
    max_value_index = [i for i, j in enumerate(percent_similarity) if j == max(percent_similarity)][0]
    map = [to_match[max_value_index] if max(percent_similarity) > 0.9 else a][0]
    return map


strlist = ['D-saturn 6-pluto', 'D-astroid 3-cyclone', 'DL-astroid 3-cyclone', 'DL-astroid', 'D-comment', 'literal']
to_match = ['saturn 6-pluto', 'pluto', 'astroid 3-cyclone', 'D-comment', 'D-astroid']

map = [similar(item, to_match) for item in strlist]
pprint(map)

最佳答案

您可以从第二个列表创建字典并将其应用到第一个列表:

strlist = ['D-astroid 3-cyclone', 'DL-astroid 3-cyclone', 'DL-astroid', 'D-comment', 'satellite']
to_match = ['astroid 3-cyclone', 'D-comment', 'D-astroid']
d1 = {i.split('-')[-1]:i for i in to_match}
result1 = [d1.get(i.split('-')[-1], i) for i in strlist]
result2 = {b:[i for i in strlist if i.endswith(a)] for a, b in d1.items()}
result2 = {a:b if len(b) != 1 else b[0] for a, b in result2.items()}

输出:

['astroid 3-cyclone', 'astroid 3-cyclone', 'D-astroid', 'D-comment', 'satellite']
{'astroid 3-cyclone': ['D-astroid 3-cyclone', 'DL-astroid 3-cyclone'], 'D-comment': 'D-comment', 'D-astroid': 'DL-astroid'}

关于python - 根据相似性替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57296078/

相关文章:

python - 打印文件名

python - Scipy 用更复杂的函数优化 linprog

python - 重启消耗可再填充迭代器的生成器

无法获取 arr[] : Implicit conversion loses integer precision: 'unsigned long' to 'int' for strlen(arr) 的长度

mysql - 在mysql中获取部分字符串

php - php 字符串中第二个字符小写

php - preg_replace 模式和主题数组返回空数组

php - PHP 的 str_replace 替代方案

python - 在 Python 中使用冒号对列表进行切片时,是否可以使用大于列表长度的停止大小?

c++ - 为什么在这种情况下它不是 constexpr ?