Вот моя ситуация:
У меня есть один список названий продуктов, таких как:
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'
Эта функция отображена таким образом, что она циклически повторяется для каждого продукта в списке продуктов.
Я пытался найти способ использовать лямбды здесь, карты, аппликации и т. Д., Но не могу обернуть это вокруг себя. Каков был бы самый эффективный способ выполнить то, что я пытаюсь сделать, с помощью прямых списков или в пандах? Кроме того, я получаю эти списки товаров и продуктов из базы данных postgres, так что если вы думаете, что в psql было бы быстрее, я бы пошел по этому пути.