次のようなMySQLのクエリからのタプルがあります。
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
すべての文字列要素を整数に変換して、リストのリストに戻したいと思います。
T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]
これを eval
で実現しようとしましたが、まだまともな結果が得られていません。
int()
は,文字列を整数値に変換するPython標準の組み込み関数です.数値を含む文字列を引数にして呼び出すと、整数に変換された数値が返されます。
print (int("1") + 1)
上の例では,2
と表示されます。
リストの構造 T1 (単純にリストを含んでいて、一階層だけであること)を知っていれば、Python 2 でこれを行うことができます。
T2 = [map(int, x) for x in T1]
Python 3では。
T2 = [list(map(int, x)) for x in T1]
これは、リスト内包で行うことができます。
T2 = [[int(column) for column in row] for row in T1]
内側のリスト内包([int(column) for column in row]
)は,row
にある10進数の文字列のようなint
が使えるオブジェクトの列からint
のlist
を構築します.外側のリスト内包([... for row in T1])
)は,内側のリスト内包の結果をT1
の各項目に適用したリストを構築します.
このコードスニペットは,int
で変換できないオブジェクトが行に含まれていると失敗します。12進数ではない文字列を含む行を処理したい場合には,もっとスマートな関数が必要になるでしょう。
もし,行の構造がわかっていれば,内部のリスト内包をその行の関数の呼び出しに置き換えることができます。例えば
T2 = [parse_a_row_of_T1(row) for row in T1]
単なるタプルのタプルであれば、rows=[map(int, row) for row in rows]
のようにすればいいでしょう。(そこにはリスト内包と、[f(a) for a in lst]に等しいmap(f, lst)の呼び出しがあります)。
もし、何らかの理由でデータベースに __import__("os").unlink("importantsystemfile")
のようなものがある場合には、Evalはしたくないものです。
常に入力を検証してください(他に何もしなくても、入力に問題があれば例外int()が発生します)。