09.配列変数


ここでいきなりですが、たとえば笑点メンバーを全員表示する時、
今までのやり方ですと、こんな組み方をしなければなりませんでした。

## encoding: utf-8

#変数に値を代入
master = "園楽"
member01 = "小遊三"
member02 = "好楽"
member03 = "木久蔵"
member04 = "歌丸"
member05 = "楽太郎"
member06 = "こん平"

#メンバー表示
print "笑点メンバー一覧\n\n"

print("司会者\n",master,"師匠\n\n")
print("回答者\n")
print(member01,"師匠\n")
print(member02,"師匠\n")
print(member03,"師匠\n")
print(member04,"師匠\n")
print(member05,"師匠\n")
print(member06,"師匠\n")

# 全員表示し終わったら終了
print("\n以上、笑点メンバーです!!")

02
結果は一応こんな感じです。
実際に組んでいただければよくわかると思いますが、
めちゃくちゃややこしいですよね(;・∀・)
特に人数分の変数を準備しなきゃいかんのが大変です。
司会者と回答者が分かれているのは仕方ないとしても、
せめて回答者だけでも一つの変数にまとめることができれば……と思いません?

そんなときに使うのが『配列変数』という変数です。
今までの変数と違って、複数のデータを代入出来るのが強みです。
よく『普通の変数は一軒家』『配列変数は集合住宅』なんて言われますね。
イメージ的にはこんな感じ。
01
説明し辛いwww
これをうまく理由すれば、同じカテゴリの複数データをまとめて一つの変数にいれられます。
今回でいえば、笑点メンバーの回答者全員を、
一つの配列変数にまとめて入れてしまうわけなんです。

というわけで、先ほどの笑点メンバーのプログラムですが、
配列を利用するとこんな感じにできます。

## encoding: utf-8

#司会者の設定
master = "園楽"

#回答者名を配列変数に代入
member=["小遊三","好楽","木久蔵","歌丸","楽太郎","こん平"]

#メンバー表示
print "過去の笑点メンバー一覧\n\n"

print("司会者\n",master,"師匠\n\n")
print("回答者\n")
print(member[0],"師匠\n")
print(member[1],"師匠\n")
print(member[2],"師匠\n")
print(member[3],"師匠\n")
print(member[4],"師匠\n")
print(member[5],"師匠\n")

# 全員表示し終わったら終了
print("\n以上、笑点メンバーです!!")

これで走らせてもらえれば、さっきのと変わらない結果が出ると思いますよ。
さっきのに比べて、ちょっとすっきりしたと思います。
少なくとも管理してる変数の数が7つから2個に減ってるので、
その辺は心理的負担が小さいですよね。

キモはこの部分。

#回答者名を配列変数に代入
member=["小遊三","好楽","木久蔵","歌丸","楽太郎","こん平"]

ここで変数memberに各メンバーの名前をまとめて代入してます。
代入したデータは左から0,1,2,3,4,5の番号が自動で振られて、
それぞれ使う時は『変数memberの0番のデータをちょうだい』
的な感じで指定してあげます。

今回のケースでいえば、実際に指定しているところはここ。

print(member[0],"師匠\n")

こんな感じで、『変数memberの0番』を使う時は、
『member[0]』て指定してあげます。
ちなみに、この番号のことを『添字』といいます。

さて、この配列変数への値の代入ですが、
ちゃんと変数らしく代入し直しが出来ます。
ちょうど先ほどのプログラムですと、笑点メンバーは古いメンバーのままなので、
途中で新しいメンバーに変更してみます。どすっ

## encoding: utf-8

#司会者の設定
master = "園楽"

#回答者名を配列変数に代入
member=["小遊三","好楽","木久蔵","歌丸","楽太郎","こん平"]

#メンバー表示
print "過去の笑点メンバー一覧\n\n"

print("司会者\n",master,"師匠\n\n")
print("回答者\n")
print(member[0],"師匠\n")
print(member[1],"師匠\n")
print(member[2],"師匠\n")
print(member[3],"師匠\n")
print(member[4],"師匠\n")
print(member[5],"師匠\n")

# 全員表示し終わったら終了
print("\nこれは過去のメンバーです")
print("\n----------------------------------------\n")

#メンバーを新しいメンバーに変更する
#司会者設定
master="歌丸"

#回答者設定
member[2]="木久扇"                   #一つの要素だけ入れ替える場合
member[3..5]=["昇太","園楽","たい平"]  #複数の要素をまとめて入れ替える場合

#メンバー表示
print "現在の笑点メンバー一覧\n\n"

print("司会者\n",master,"師匠\n\n")
print("回答者\n")
print(member[0],"師匠\n")
print(member[1],"師匠\n")
print(member[2],"師匠\n")
print(member[3],"師匠\n")
print(member[4],"師匠\n")
print(member[5],"師匠\n")

# 全員表示し終わったら終了
print("\n以上が現在のメンバーです\n\n")

こんな感じです。結果はこちら。
03

キモはここ。

member[2]="木久扇"                   #一つの要素だけ入れ替える場合
member[3..5]=["昇太","園楽","たい平"]  #複数の要素をまとめて入れ替える場合

上の木久蔵師匠→木久扇師匠への変更は、一つだけですが、
複数のデータを一変に変更する場合は、こんな感じで指定してあげれば可能です。
意味合いとしては『3番から5番までを、それぞれ”昇太”、”園楽”、”たい平”に変更してね』
て感じでしょうか。

こんな感じで、データの変更も可能です。

さらに言うと、今回は名前だけの配列ですが、
配列の中に配列を入れるという、ややこしいことも可能です。

## encoding: utf-8

#司会者の名前と色を配列変数に代入
master = ["歌丸","緑色"]

#回答者名と色をを配列変数に代入
member=[["小遊三","水色"],["好楽","ピンク"],["木久扇","黄色"],["昇太","薄緑"],["園楽","紫色"],["たい平","オレンジ"]]

#メンバー表示
print "現在の笑点メンバーと色の一覧\n\n"

print("司会者\n",master[0],"師匠\t",master[1],"\n\n")
print("回答者\n")
print(member[0][0],"師匠\t",member[0][1],"\n")
print(member[1][0],"師匠\t",member[1][1],"\n")
print(member[2][0],"師匠\t",member[2][1],"\n")
print(member[3][0],"師匠\t",member[3][1],"\n")
print(member[4][0],"師匠\t",member[4][1],"\n")
print(member[5][0],"師匠\t",member[5][1],"\n")

# 全員表示し終わったら終了
print("\n以上が現在のメンバーです\n\n")

この辺は『多重配列』もしくは『多次元配列』って言ったりします。
今回のケースでいえば、二重の配列になってるので『2次元配列』て言ったりしますね。
配列全体がエクセルの表みたいになってるとでも言えばいいのでしょうか。
結果はこんな感じです。
04

キモはここ。

#回答者名と色をを配列変数に代入
member=[["小遊三","水色"],["好楽","ピンク"],["木久扇","黄色"],["昇太","薄緑"],["園楽","紫色"],["たい平","オレンジ"]]

配列として代入するデータの一つ一つをさらに配列にしたって感じですかね。
こういう使い方もできるのです。

指定の仕方は、『member[0]の0番』という指定の仕方ですね。
つまり『member[0][0]』て感じです。

さて、ここまでやってて『いや別に普通の変数でよくね?(;・∀・)』て思いません?
実際、今のままではあまり配列変数の良さってよく分からんのですよ。

ですがこの配列変数……実は今まで学んできたある処理と組み合わせると、
使い勝手と便利さが恐ろしく向上します。

それは、『08.繰り返し』で学んだ、『While文』と『for文』。
この2つと配列変数を組み合わせてはじめて。配列変数はその便利さが発揮されるのです(・∀・)

というわけで、おれが好きなfor文を使って、上のプログラムをちょいと書き換えてみました。

## encoding: utf-8

#司会者の名前と色を配列変数に代入
master = ["歌丸","緑色"]

#回答者名と色をを配列変数に代入
member=[["小遊三","水色"],["好楽","ピンク"],["木久扇","黄色"],["昇太","薄緑"],["園楽","紫色"],["たい平","オレンジ"]]

#メンバー表示
print "現在の笑点メンバーと色の一覧\n\n"

#司会者
print("司会者\n",master[0],"師匠\t",master[1],"\n\n")

#回答者
print("回答者\n")

#for文を使って回答者を全員表示
for count in 0..5 do
  print(member[count][0],"師匠\t",member[count][1],"\n")
end

# 全員表示し終わったら終了
print("\n以上が現在のメンバーです\n\n")

これでもさっきと同じ結果が出るはずです。
キモはここ。

#for文を使って回答者を全員表示
for count in 0..5 do
  print(member[count][0],"師匠\t",member[count][1],"\n")
end

要は今まで『member0を表示して』『member1を表示して』ていちいち指定してたのを、
繰り返しが得意なfor文を駆使して、指定する番号をどんどん変化させてるわけなんですよ。
今回は笑点メンバーなので人数が少なくてよいのですが、
たとえばこれがAKB48メンバーだとしたら、
48回もこっちでいちいち指定するのもしんどいですよね。
そんなときにはこのfor文、もしくはwhile文を使って、
ひたすら表示を繰り返してやればいいのです。

というわけで、for文の中にさらにfor文を突っ込んで、
表示する項目を増やしてみました。それがこちらっ

## encoding: utf-8

#司会者の名前と色を配列変数に代入
master = ["歌丸","緑色"]

#回答者名と色をを配列変数に代入
member=[["小遊三","水色",6],["好楽","ピンク",3],["木久扇","黄色",4],["昇太","薄緑",9],["園楽","紫色",0],["たい平","オレンジ",2]]

#メンバー表示
print "現在の笑点メンバーと着物の色と現在の座布団の枚数一覧\n\n"

#司会者
print("司会者\n",master[0],"師匠\t",master[1],"\n\n")

#回答者
print("回答者\n")
print("名前\t","着物の色\t","座布団の枚数\n")

#for文を使って回答者を全員表示
for count in 0..5 do
  for category in 0..2 do
        print(member[count][category])  #変数内を表示
        
        #表示しているものにより、処理変更
        case category
          when 0 then
            print "師匠\t"
          when 1 then
            print "\t"
          when 2 then
            print "枚\n"
        end
        #case終了
        
  end
end

# 全員表示し終わったら終了
print("\n以上が現在のメンバーです\n\n")

これは各メンバーの現在の獲得枚数も配列に与えまして、
その上で各項目の表示もfor文で回してみました。
要は多重繰り返し構文。ついでに条件分岐のcase文も組み合わせてみました。

この結果はこちら。
05

さて、先ほど
for文while文と組み合わせると、使い勝手と便利さが恐ろしく向上します( ・´ー・`)どや』
と説明させていただいたのですが……

どうもこの配列変数と繰り返し構文の組み合わせ。
プログラミング初心者が挫折する鬼門らしいです(;・∀・)
なんでも、考えてるうちにどんどんわけがわからなくなるんだとか。
おれも最初の頃はさっぱり分からんかったですからねぇ……(´・ω・`)

ちなみにおれが挫折仕掛けの頃に心がけたのが、
いちいち紙に書いてみること。
繰り返し構文をいくつも重ねて回していると、
ほんとに意味がわからなくなってきます(;・∀・) だれだってそう。

そんな時は、配列変数の中味を紙に書いてみます。
繰り返し一回目の変数の中味、二回目の変数の中味……
そんな感じで、その繰り返しの中で参照する変数の中味を紙に書き出してみます。
そうして慌てずゆっくり、時間をかけて組み立ててあげれば、ちゃんと出来上がりますよ。

あとは、ひたすら組んで慣れるのが一番ですかね。
こういうのは場馴れするのが一番です。間違ったってパソコン壊れたりはしないですし、
いっぱい間違えていっぱいエラー出して、今のうちにエラーに慣れておくといいです。

プログラマーのたった1回の成功の影には、
数えきれないほどの回数のエラーがあるのですよ(・∀・)

そのうち『fatal error致命的なエラー)』なんかが見慣れてきたら一人前っぽい?w