【发布时间】:2018-11-02 01:35:48
【问题描述】:
这是我的情况:
我有一个产品名称列表,例如:BLUEAPPLE, GREENBUTTON20, 400100DUCK20 (len = 9000)
以及官方项目名称列表,例如:BLUEAPPLE, GREENBUTTON, 100DUCK。 (len = 2700)
由于我将对产品 - 项目应用模糊字符串匹配,因此我想从产品名称中去除不必要的数字 - 但保留在正式项目名称中表示的数字。
我想出了一个解决方案,但问题是它非常运行缓慢。
def remove_nums(product):
if bool(re.search('\d'), product):
for item in item_nums_list:
if item in product_name:
substrings = [u for x in product_name.split(item) for u in (x, item)][:-1]
no_num_list = [re.sub('(\d+)', '', substring) if substring not in item else substring for substring in substrings]
return ''.join(no_num_list)
return re.sub('(\d+)', '', product)
else:
return product
例子:
product_name = '400100DUCK20'
item = '100DUCK'
substrings = ['400','100DUCK','20']
no_num_list = ['','100OG','']
returns '100DUCK'
此函数已映射,因此它循环遍历产品列表中的每个产品。
我一直在尝试找出一种在此处使用 lambda、映射、应用等的方法,但无法完全理解它。什么是最有效的方式来完成我正在尝试做的事情,无论是使用直接列表还是在熊猫中?或者,我从 postgres 数据库中获取这些项目和产品列表,因此如果您认为在 psql 中执行此操作会更快,我会走这条路。
【问题讨论】:
-
举个例子,你为什么不直接返回
item -
不幸的是,由于我匹配的产品和项目的性质,退回项目会导致很多误报。例如:
COLA100(产品)将与A10(官方项目)匹配,而实际上它们不应该匹配。我稍后应用的模糊字符串匹配有望纠正这个问题。
标签: python pandas lambda apply psql