質問
私はクラスの初歩的なFSMを行う必要があり、およびPythonでそれを書いています。割り当ては、我々は、テキストファイルからマシンの遷移を読む必要です。したがって、たとえば、「」と「b」が可能な入力と、2つの可能な遷移を持っているそれぞれの3つの状態を持つFSMは、テキストファイルを持っているwolud、このようになります。
2 # first line lists all final states
0 a 1
0 b 2
1 a 0
1 b 2
2 a 0
2 b 1
文字列として入力ヴァルスを保ちながら、私は、一度にラインを読んで、int型に状態を変換するために、より多くの神託の方法を思い付くしようとしています。基本的に、これはアイデアがあります:
self.finalStates = f.readline().strip("\n").split(" ")
for line in f:
current_state, input_val, next_state = [int(x) for x in line.strip("\n").split(" ")]
もちろん、それはそれはとValueErrorをスローします(「」)int型にしようとしたとき。私は、伝統的なループを使用することができます知っているだけとValueErrorをキャッチが、私はこれを行うための、よりPython的な方法を持っていることを期待してます。
解決
あなたは本当にあなただけが整数であることを期待しているトークンを解析しようとしなければならない。
for line in f:
tokens = line.split(" ")
current_state, input_val, next_state = int(tokens[0]), tokens[1], int(tokens[2])
おそらくもっと可読ます:
for line in f:
current_state, input_val, next_state = parseline(line)
def parseline(line):
tokens = line.split(" ")
return (int(tokens[0]), tokens[1], int(tokens[2]))
他のヒント
これは非常に機能的なものであるが、それは「神託」だ場合、私はわからないんだけど...そして、それは一部の人々が彼らの頭に傷することがあります。あなたは本当にあなたが多数の値を持っている場合、このようにそれを行うには、「怠惰」ジッパーを()持っている必要があります:
types = [int, str, int]
for line in f:
current_state, input_val, next_state = multi_type(types, line)
def multi_type(ts,xs): return [t(x) for (t,x) in zip(ts, xs.strip().split())]
デフォルトはここで働いてますので、また、あなたがストリップと分割に使用する引数は、省略することができます。
編集:再フォーマット - 私は実際のコード内の1つの長い行としてそれを使用することはありません。
あなたも、あなたの問題に一致する優れた答えを得ました。しかし、他の例では、確かにあなたが可能な場合(すなわち、それらはすべての桁なら)int
にいくつかのフィールドを変換したい状況があるかもしれないし、(あなたの質問のタイトルが示すように)することなく、それ以外の場合はstr
として<全角>それらを残しますは事前に知っフィールドがint型であるとどのものがありません。
は、伝統的なPythonのアプローチがあるのtry / ...除います:
def maybeint(s):
try: return int(s)
except ValueError: return s
...あなたは(例えば、リスト内包で)表現を除いて試して/実行する方法はありませんとして関数にラップする必要があります。だから、あなたのようにそれを使用したい:
several_fields = [maybeint(x) for x in line.split()]
しかし、それはがのご希望の場合は、この特定のタスクをインラインで行うことが可能
several_fields = [(int(x) if x.isdigit() else x) for x in line.split()]
if
/ else
「三項演算子は」少し奇妙に見えますが、1が;-)それに慣れることができます。文字列が空でないと数字だけを持っている場合、文字列のisdigit
方法は、Trueを与えるます。
繰り返すには、これはあなたが入力タイプの特定int
-str
-int
パターンを知っているあなたの特定のケースで何をすべきか、のないのです。それはあなたが事前に、このような正確な情報を持っていない、より一般的な状況で適切であるかもしれない!
self.finalStates = [int(state) for state in f.readline().split()]
for line in f:
words = line.split()
current_state, input_val, next_state = int(words[0]), words[1], int(words[2])
# now do something with values
あなただけのline.strip("\n").split(" ")
にline.split()
ダウンを短縮できることに注意してください。 str.split()
のデフォルトの動作は、空白に分割することであり、それは、任意の並べ替えのない先頭または末尾の空白を持たない単語の集合を返します。
あなたがループ内でint
に状態を変換する場合は、私もあなたがfinalStates
はint
になりたいと推定ます。