Я пытаюсь реализовать алгоритм Soundex вручную, и для этого необходимо преобразовать буквенные текстовые символы в числовые c текстовые символы. Я определил следующую функцию:
import re
def sub_pattern(text):
sub = [str(i) for i in range(1,4)]
string = text
abc = re.compile('[abc]')
xyz = re.compile('[xyz]')
encode = [abc, xyz]
encode_iter = iter(encode)
alpha_search = re.compile('[a-zA-Z]')
for i in sub:
if alpha_search.search(string):
pattern = next(encode_iter)
string = pattern.sub(i, string)
else:
return(string)
Эта функция будет кодировать abc
символов в 1
и xyz
символов в 2
. Тем не менее, это работает только для одной строки, и мне нужно передать список строк в функцию. Я получил результаты, которые хочу использовать:
list(map(sub_pattern, ['aab', 'axy', 'bzz']
Но я хочу иметь возможность передать список функции напрямую. Я попытался это безуспешно, так как он заканчивается только возвращением первой строки из списка.
def sub_pattern(text_list):
all_encoded = []
sub = [str(i) for i in range(1,4)]
abc = re.compile('[abc]')
xyz = re.compile('[xyz]')
encode = [abc, xyz]
encode_iter = iter(encode)
alpha_search = re.compile('[a-zA-Z]')
for string in text_list:
for i in sub:
if alpha_search.search(string):
pattern = next(encode_iter)
string = pattern.sub(i, string)
else:
all_encoded.append(string)
Несколько замечаний:
- Поскольку я реализую алгоритм Soundex, порядок текста при его кодировании имеет значение. Я бы предпочел обновить строковый символ по его первоначальному индексу, чтобы избежать необходимости реорганизовывать его впоследствии. Другими словами, вы не можете выполнять какую-либо сортировку строки ... Я создал итератор для постепенного обновления строки, и он получает следующий шаблон
regex
, только если все символы еще не были преобразованы. - Эта функция будет частью двух пользовательских классов, которые я создаю. Оба будут вызывать метод
__iter__
, чтобы я мог создать итерацию. Вот почему я использую функцию iter()
для создания итерации, потому что она создаст новый экземпляр, если итератор автоматически.
Я знаю, это может показаться тривиальным вопросом относительно того, что я делаю, но я застрял.
Заранее спасибо.