python - 如何使用 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)
解决方案
您可以使用:
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]]]
推荐阅读
- twilio - 用户如何选择退出来自字母数字发件人 ID 的 twilio 消息
- python - 在windows中激活python虚拟环境时设置环境变量
- ios - Swift - 只允许在 UITableViewCell 中选择一个复选框
- reactjs - 抓取 Chrome 扩展程序呈现的内容的最佳方法是什么?
- wpf - 每当我单击该项目时,我都试图使我的 ListViewItems 不会以虚线边框突出显示。代码在 WPF XAML 中
- sql-server - Varchar 和 nvarchar 不同的隐式转换为 int
- python-2.7 - 有没有更快的方法使用列表从 NDB 查询?
- c++ - sizeof 总是一样吗?
- android - ZXingScannerView.java me.dm7.barcodescanner.zxing.ZXingScannerView.onPreviewFrame 中的 NoSuchMethod
- c# - 如何创建具有一定数量数字的随机字符串?