アンパッキングその1
アンパッキングその1
競技プログラミングで最初に躓くであろうデータストラクチャのアンパッキング。Pythonだと「そんなんでいいんかい!」っていうシンタックスがあるので、まずはそれらに慣れる事が重要だと思われる。
numbers = (1,2,3,4,5) a,b,c,d,e = numbers print(a) print(b) print(e) print(d) print(c) # 1 # 2 # 5 # 4 # 3
こんなんで良い。
↑ではtupleを使ったけれど、リストでも良い。 尚、以降はドラクエ(細かく言うとドラクエ3)を例に取って説明していく。日本人的にイメージがしやすいと思ったからなのだけれど、ドラクエ3を知らない人には何も言うことはない。
infernos = ['ギラ', 4, ('HERO','MAGE','SAGE')] name_japanese, mp_cons, jobs = gira print(name_japanese) print(mp_cons) print(jobs)
ギラ 4 ('HERO', 'MAGE', 'SAGE')
【解説】 giraという変数にリストをアサイン。そのリストの中には 1. その魔法の日本語名 2. 消費MP 3. その魔法を覚えることが出来る職業 が入っている。更に(3)の職業に関してはtupleで、複数の文字列が格納されている。
これも同じパターンで、順番にコレとコレとコレを格納ーって感じでアサインすればOK。順番と数だけ間違わなければ、問題なく各変数に割り当てられる。(ちなみに数を間違うとValueErrorが返ってくる。)
ここまでtupleとlistを相手にしてきたけれど、iterableなら実は何でもOK。文字列自体もiterableなので、同じような事が出来る。Pythonすごい。
informore = 'ベギラマ' s_1, s_2, s_3, s_4 = informore print(s_1) print(s_2) print(s_3) print(s_4)
ベ ギ ラ マ
あと、途中にある値を無視したい場合。例えばさっきの例で
infernos = ['ギラ', 4, ('HERO','MAGE','SAGE')]
真ん中にある消費mpは無視したい場合、適当な捨て変数に割り当てるっていう強引な技がある。だいたいアンダースコア_
が使われる事が多いような気がする。
gira = ['ギラ', 4, ('HERO','MAGE','SAGE')] name_japanese, _, jobs = gira