2021年8月からAWSのLAMBDAとdjangoでpythonの仕事をやり始めたんですが、これまでPHPばかりに偏ってたものでpythonに慣れるのに結構苦労した事の中で、dict変数があったのでその辺の事を書いてみます。
###1.PHPだと連想配列は簡単に作れたが、dictは宣言が無いとエラーになって勝手に作ってくれない
PHPでは、自分の必要な時に
$sample1["hoge"] = "aaabbbccc";
のように書けば、配列変数$sample1が作成され、$sample1["hoge"]という連想配列が作成され、aaabbbcccを代入してくれる。
pythonのdict変数でこれをやると、NameErrorとなってしまう。
C:\project\python_test>python3 sample1.py
Traceback (most recent call last):
File "sample1.py", line 2, in <module>
sample1["hoge"] = "aaabbbccc"
NameError: name 'sample1' is not defined
通常の変数は宣言が必要ないのに、dictやlist変数になると、途端に話が変わってくる事に最初はとまどった。
以下のように書くと正常に実行できる。
sample1 = {"hoge":""}
sample1["hoge"] = "aaabbbccc"
ここで、覚えたての頃は、sample1 = {"hoge":""}と書くのかsample1 = dict(hoge="")と書くのがいいのか?といった表記で悩んだが、どっちでもいいというのがわかった。
##2.連想配列のキーを変数で渡したい時
次に、連想配列のキーを変数で渡したい時
$keystr = "hoge";
$samples1[$keystr] = "aaabbbccc";
PHPでは定数 or 変数で連想配列のキーを渡したい時にさほど違いはないが、dictも同様に
keystr = "hoge"
sample1 = {keystr:""}
sample1[keystr] = "aaabbbccc"
で、同じ操作を実現可能です。1点気を付けることがあるとすれば、keystrを他のobjectから取り出した値のような場合に、必ず文字列になってるとは限らないので、str()関数で文字列化しておくと安全です。
##3.連想配列に複数のキーを変数で渡して代入したい時
最初に一番悩んだ部分がここだった。
というのは、jsonに変換した際に、
{"hoge1":"a","hoge2":"a"}
となってほしかった。
PHPでこういう事をしたかった。
$sample1 = array();
$keylist = array("hoge1","hoge2");
foreach($keylist as $keystr)
{
$sample1[$keystr] = "a";
}
これと同じことをpythonのdictでやろうとするとPHPと同様に
keylist = ["hoge1","hoge2"]
value = "test"
sample1 = {}
for keystr in keylist:
sample1[keystr] = value
先にsample1 = {}とsample1がdict変数であることを定義しておけば問題ない。
4.既に中身の入ったdict変数に要素を追加する時
$sample1 = array("hoge1"=>"test");
$keystr = "hoge2";
$value = "test2";
$sample1[$keystr] = $value;
この時もほぼPHPと同様な方法で代入できる。
keystr = "hoge2"
value = "test2"
sample1 = {"hoge1":"test"}
sample1[keystr] = value
または
sample1.update({keystr:value})
1回目はここまで。