如何使用np.where或list理解创建子字符串掩码?

2023-02-06 14:17:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我想比较两个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']

在另一个线程中的人的帮助下,我得以接近。但是,这些结果返回列表1中的值,但我希望我的结果返回列表2中匹配的子字符串

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) 

Tags: 字符串代码in列表forinputnpnansolutionlist2fdalist1list3mnxkgj
3条回答

该函数将返回比较的列表。它检查substring是否在main string中,如果是True,则追加x列表。完成一个子字符串后,if statement检查是否存在匹配项。如果是,则附加它,如果不是,则附加一个None

list1 = ['fda3232', 'fcg3224', 'kgj5543', '3323fda9832', 'ffz3392', '221gks9483', 'mnx8385', 'aaz9323', '332kgj4323'] 
list2 = ['fda', 'kgj', 'mxx', 'mnx']

def chan(list1, list2):
    for i in list1:
        x = []
        for j in list2:
            if j in i:
                x.append(j)
        if len(x) > 0:
            lister.append(''.join(x))
        else:
            lister.append(None)
    return lister
print(chan(list1, list2))

您可以使用:

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]]]

看看这是否有效。逻辑是,抑制list1中的所有数字以获取代码,并查看该代码是否在list2中。如果是,则附加代码,否则附加任何其他占位符,如-nan

list3 = []
for item in list1:
    code = re.sub(r'[0-9]+', '', item)
    if code in list2:
        list3.append(code)
    else:
        list3.append(np.nan)

print(list3)

输出:

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

相关问题 更多 >