【備忘録】Pythonで動的に変数を取得する方法
状況
数独を解くプログラムの作成中に、先に変数名が決まっている状態で、数値代入をするかsympyのsymbol変数として扱うかを動的に決めたかったので調べた。
コマンド
exec()を使うと、()内のstringで打ち込んだコードを使用してくれる←日本語合っとるか??
書いたやつ
import sympy #A B C D E F G H I probrems = [[0, 0, 0, 9, 0, 3, 0, 0, 0], # a [2, 3, 0, 8, 7, 0, 0, 4, 0], # b [0, 0, 0, 0, 0, 0, 0, 0, 6], # c [5, 2, 0, 0, 8, 0, 0, 0, 0], # d [0, 0, 0, 2, 0, 0, 4, 0, 0], # e [4, 0, 0, 6, 0, 0, 1, 0, 2], # f [0, 0, 9, 0, 0, 0, 0, 0, 0], # g [7, 8, 3, 0, 9, 0, 0, 0, 0], # h [0, 0, 0, 0, 5, 0, 8, 0, 0]] # i values = [["Aa","Ba","Ca","Da","Ea","Fa","Ga","Ha","Ia"], ["Ab","Bb","Cb","Db","Eb","Fb","Gb","Hb","Ib"], ["Ac","Bc","Cc","Dc","Ec","Fc","Gc","Hc","Ic"], ["Ad","Bd","Cd","Dd","Ed","Fd","Gd","Hd","Id"], ["Ae","Be","Ce","De","Ee","Fe","Ge","He","Ie"], ["Af","Bf","Cf","Df","Ef","Ff","Gf","Hf","If"], ["Ag","Bg","Cg","Dg","Eg","Fg","Gg","Hg","Ig"], ["Ah","Bh","Ch","Dh","Eh","Fh","Gh","Hh","Ih"], ["Ai","Bi","Ci","Di","Ei","Fi","Gi","Hi","Ii"]] for hori in range(9): for vart in range(9): tmp = probrems[hori][vart] name = values[hori][vart] if tmp != 0: exec('{} = {}'.format(name,tmp)) if tmp == 0: exec('{} = sympy.Symbol("{}",positive=True)'.format(name,name))
出力
分かりにくいが、アルファベット部分はsympyのsymbolになってる。
[Aa, Ba, Ca, 9, Ea, 3, Ga, Ha, Ia] [2, 3, Cb, 8, 7, Fb, Gb, 4, Ib] [Ac, Bc, Cc, Dc, Ec, Fc, Gc, Hc, 6] [5, 2, Cd, Dd, 8, Fd, Gd, Hd, Id] [Ae, Be, Ce, 2, Ee, Fe, 4, He, Ie] [4, Bf, Cf, 6, Ef, Ff, 1, Hf, 2] [Ag, Bg, 9, Dg, Eg, Fg, Gg, Hg, Ig] [7, 8, 3, Dh, 9, Fh, Gh, Hh, Ih] [Ai, Bi, Ci, Di, 5, Fi, 8, Hi, Ii]
一口メモ
多分、for文で回しながらformatを使って可変量の変数を作り、処理しそう。
変数(listも同様)定義、処理、アウトプット全部exec()でやることになると思う。
formatがC++で言うsprintf()と同じと考えればわかりやすい(ハズ)。