Python - 文字處理狀態機



狀態機是關於設計一個程式來控制應用程式中的流程。它是一個有向圖,由一組節點和一組轉換函式組成。處理文字檔案通常包括順序讀取文字檔案的每個塊,並對讀取的每個塊做一些操作。塊的含義取決於之前存在哪些型別的塊以及之後會出現哪些塊。該機器是關於設計一個程式來控制應用程式中的流程。它是一個有向圖,由一組節點和一組轉換函式組成。處理文字檔案通常包括順序讀取文字檔案的每個塊,並對讀取的每個塊做一些操作。塊的含義取決於之前存在哪些型別的塊以及之後會出現哪些塊。

考慮這樣一種情況:文字輸入必須是AGC序列(用於蛋白質分析)的連續重複字串。如果輸入字串中保持此特定序列,則機器的狀態保持為TRUE,但一旦序列發生偏差,機器的狀態變為FALSE,並在之後保持FALSE。這確保了即使稍後可能還有更多正確的序列塊可用,也停止進一步處理。

下面的程式定義了一個狀態機,該狀態機具有啟動機器、獲取文字處理輸入和逐步進行處理的功能。

class StateMachine:

# Initialize 
    def start(self):
        self.state = self.startState

# Step through the input
    def step(self, inp):
        (s, o) = self.getNextValues(self.state, inp)
        self.state = s
        return o

# Loop through the input		
    def feeder(self, inputs):
        self.start()
        return [self.step(inp) for inp in inputs]

# Determine the TRUE or FALSE state
class TextSeq(StateMachine):
    startState = 0
    def getNextValues(self, state, inp):
        if state == 0 and inp == 'A':
            return (1, True)
        elif state == 1 and inp == 'G':
            return (2, True)
        elif state == 2 and inp == 'C':
            return (0, True)
        else:
            return (3, False)


InSeq = TextSeq()

x = InSeq.feeder(['A','A','A'])
print x

y = InSeq.feeder(['A', 'G', 'C', 'A', 'C', 'A', 'G'])
print y


當我們執行上面的程式時,我們得到以下輸出:

[True, False, False]
[True, True, True, True, False, False, False]

在x的結果中,AGC模式在第一個'A'之後的第二個輸入處失敗。結果的狀態在此之後永遠保持False。在Y的結果中,AGC模式持續到第4個輸入。因此,結果的狀態在此之前一直保持為True。但從第5個輸入開始,結果變為False,因為期望G,但發現了C。

廣告

© . All rights reserved.