Как правильно установить правила fst

Я связался с преобразователями и python, поэтому использую библиотеку FST по умолчанию. Например, у меня есть список ['a','b','c']. Мне нужно заменить 'b', если за ним следует 'c'. Я делаю следующие правила, но они работают только если 'b' находится между 'a' и 'c' и только с этой длиной массива.

from fst import fst
list = ['a','b','c']
t = fst.FST('example')
for i in range(0,len(list)):
    t.add_state(str(i))

t.initial_state = '0'
t.add_arc('0','0',('a'),('a'))
t.add_arc('0','1',('b'),('d'))
t.add_arc('1','1',('c'),('c'))
t.set_final('1')

print t.transduce(list)

У меня есть ['a','d','c']. Мне нужно заменить 'b' на 'd', где бы он ни был. например замените 'b', если за ним следует 'l'

['m','r','b','l'] => ['m','r','o','l'] 
['m','b','l'] => ['m','o','l'] 
['b','l','o'] => ['o','l','o'] 

Пожалуйста, помогите мне, спасибо!


person markkillah    schedule 27.11.2014    source источник
comment
В чем причина этого? Только узнали о FST?   -  person blambert    schedule 23.07.2016


Ответы (1)


Рассмотрим эту функцию...

lists = [['m','r','b','l'], 
         ['m','b','l'], 
         ['b','l','o'], 
         ['b','m','o']]

def change(list_, find_this, followed_by, replace_to):
    return_list = list_.copy()
    idx = list_.index(find_this)
    if list_[idx+1] == followed_by:
        return_list = list_.copy()
        return_list[idx] = replace_to
    return return_list

for lst in lists:
    print(change(lst, 'b', 'l', 'o'))

''' output:
['m', 'r', 'o', 'l']
['m', 'o', 'l']
['o', 'l', 'o']
['b', 'm', 'o']
'''

Однако вы должны добавить другие соответствующие проверки.

person chapelo    schedule 27.11.2014