アンパッキングその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