物理のベンチ by mitta

学んだことを発信します。備忘録も書きます。間違いがあればコメントください。

【備忘録】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()と同じと考えればわかりやすい(ハズ)。