某スキル評価サービスに解答するためのプログラム(Python)
はっきり言ってあんまり汎用性はありませんが、某サービスの問題を解くために使ったプログラムの一部を紹介します。
問題を解く過程で、括弧を含む文字列をパースして、リスト型にするプログラムを考案しました。
例えば、
AAAA => ['A','A','A','A']
AB(CD) => ['A','A',['C','D']]
A(BC)D(E(F)) => ['A',['B','C'],'D',['E',['F']]]
と言った風にリスト型にして返します。
以下がそのコードです。
[python] def parseString(string, level = 0): chunk = [] i = 0 flag = 0 string = list(string) for j, c in enumerate(string): if c == "(": flag += 1 i += 1 elif c == ")": i -= 1 if i == level: print "test" if len(string[:j]) != 0: chunk.append(parseString(string[:j], level + 1)) if len(string[j + 1:]) != 0: for token in parseString(string[j + 1:], level): chunk.append(token) return chunk else: if i == level: chunk.append(c) return chunk [/python]まずは入力されたstringをlist()によって一文字ごとに分割したリスト型に変換しています。
一文字ずつ処理していき、"("にあたったときはそれに対応する")"がある場所までリストを走査し、")"がある部分で2分割して再帰するのがミソです。
ネストが深くなってしまいリーダブルなコードとは言えないので、もっとスマートに再帰が使えるようになりたいですね。
map関数やらジェネレータやらも使ってみたい……