首页 > 解决方案 > 如何使用 np.where 或列表推导创建子字符串掩码?

问题描述

我有两个要比较的 python 字符串列表。第一个是我的主要列表,包含一系列长代码。第二个是部分字符串的列表。

input:
list1 = ['fda3232', 'fcg3224', 'kgj5543', '3323fda9832', 'ffz3392', '221gks9483', 'mnx8385', 'aaz9323', '332kgj4323'] 

list2 = ['fda', 'kgj', 'mxx', 'mnx']

所需的结果是列表 1 的掩码,由列表 2 中的子字符串填充。如果没有找到匹配项,list3 可以返回 0、np.nan、'-' 或类似的值。换句话说,我正在寻找以下内容:

output: 

list3 = ['fda', np.nan, 'kgj', 'fda', np.nan, np.nan, 'mnx', np.nan, 'kgj']

在另一个线程中的人们的帮助下,我能够接近。但是,这些结果返回 list1 中的值,但我希望我的结果从 list2 返回匹配的子字符串。

solution 1: 
list3 = [x if any(y in x for y in list2) else np.nan for x in list1]

solution 2:
list3 = np.where([np.sum(np.char.find(x, sub=list2)+1) for x in list1], list1, np.NaN) 

标签: pythonnumpylist-comprehension

解决方案


您可以使用:

import numpy as np

list1 = ['fda3232', 'fcg3224', 'kgj5543', '3323fda9832', 'ffz3392', '221gks9483', 'mnx8385', 'aaz9323', '332kgj4323']

list2 = ['fda', 'kgj', 'mxx', 'mnx']

def isin(haystack):
    for needle in list2:
        if needle in haystack:
            return needle
    return np.nan

list3 = [isin(haystack) for haystack in list1]
print(list3)

哪个产量

['fda', nan, 'kgj', 'fda', nan, nan, 'mnx', nan, 'kgj']

你甚至可以把它理解为:

list3 = [result[0]
         for haystack in list1
         for result in [[needle for needle in list2 if needle in haystack] or [np.nan]]]

推荐阅读