Python 替换列表中的字符串

Python 替换列表中的字符串,python,replace,Python,Replace,这是我上一篇文章的后续文章,我试图用另一个列表中的字符串替换一个列表中的字符串 import numpy as np 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 =

这是我上一篇文章的后续文章,我试图用另一个列表中的字符串替换一个列表中的字符串

import numpy as np
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


if __name__ == '__main__':

    strlist = ['D-saturn 6-pluto', np.nan, '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']
    for item in strlist:
        map = [similar(item, to_match) for item in strlist]
    pprint(map)
预期产出:

['saturn 6-pluto', np.nan, 'astroid 3-cyclone', 'astroid 3-cyclone', 'D-astroid', 'D-comment', 'literal']
如果
strlist
中没有
np.nan
,则代码可以工作。 我想检查字符串是否为
nan
,如果存在则返回
nan
。 但是,我不知道如何在列表中使用
elif
语句,如果max(相似性百分比)>0.9,则理解
map=[to\u match[max\u value\u index]

有人能帮我吗?

编辑:

那么,如果项目的类型不是字符串,那么将
类似的
函数更改为返回项目本身如何

def similar(a, to_match):
    if type(a) is not str:
        return a
    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]
    ret = [to_match[max_value_index] if max(percent_similarity) > 0.9 else a][0]
    return ret

在for循环中处理之前,您可以通过以下方式过滤
strlist

strlist = [s for s in strlist if type(s) is str]

您可以在其他映射函数中编写if-else

map = [similar(item, to_match) if isinstance(item, str) else item for item in strlist]

不,我想保留
nan
值。输入实际上是一个dataframe列,我必须用新列表替换所有的值。好的,但是试着在示例中进行简化,下次不要偏离您的需要太远。如果您的输入值是一个数据帧,您也可以(例如)简单地内联编写,例如
df['astro_stuff'][~df.astro_stuff.isna()]
来处理有效的条目,同时保持数据帧的原样。offtopic但重要提示:请不要使用python关键字,如
map
作为变量名