У меня есть список кортежей (примерно 300), каждый из которых состоит из двух элементов.Первый элемент - это ключевое слово, второй - список строк, которые содержат ключевое слово.Приведенная ниже функция должна изначально генерировать кортеж, состоящий из списков, которые являются либо длинными строками, либо пустыми.Например,
beginning = [('keyword1', [] [] ['$5'] ['This has $6.50'], ['this has 4']), ('keyword2', [] [] [] [], []['5.5'])]
Я бы хотел, чтобы мой окончательный вывод удалял пустые списки и предоставлял список кортежей, в котором первое время является ключевым словом, второе - любое упоминание цены, сделанной в комментариях, которые содержатКлючевым словом и последним элементом является любая упомянутая цифра, к которой не прикреплен символ валюты.Например,
desired_output = [('keyword1', ['$6.50'] ['$5'], ['4']), ('keyword2',[],['5.5'])]
У меня есть функция ниже, но я получаю сообщение об ошибке:
TypeError: expected string or bytes-like object
Есть ли способ изменить функцию ниже, чтобы она была более эффективной или работалас его текущей структурой.
import re
def collect_keyterms(list_of_tuples):
price_re = re.compile(r'^.*[\$\£\€]\s?\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{1,2})?.*$')
number_re = re.compile(r'\b\d[.]\d{1,2}\b')
new_list = [(keyword, [re.findall(price_re, post) for post in posts], [re.findall(number_re, post) for post in posts]) for keyword, posts in tuples_with_keyword_posts]
final = [(keyword, list(filter(lambda x:re.findall(r'\d', x), currencies)), list(filter(lambda y:re.findall(r'\d', y), posts))) for keyword, currencies, posts in new_list]
return final