Pythonのfor&配列を簡単に理解する(超初心者向け)


私は独学でPythonでAtCoderに参加しています。
そこで今日は、学び始めた人(過去の私みたいな人)がわからなくなるポイントであるforと配列の簡単な解説をしようと思います!
AtCoderのforを使った入力などの話も絡めて解説します。あくまで簡単な解説です。最低ここまで知ることができたらググり力(ググるときの語彙力)も身につきます、自分で色々な関数をその都度ググって、少しずつ覚えていってくださいね!
(私は駆け出し茶色コーダーで、短い記法などは得意ではないです。また万が一嘘を書いていたら教えて欲しいです><)

for文ってなんだYo!

ふつうのかきかた

for i in range(3):
    print(i)

for文はこのような形をしています。range()のカッコの中の数字の回数、for文内部の処理が繰り返されます。
この中でいうiは、ループカウンタ変数と言って、(私もググってて今知りましたw名前はどうでもいいです)繰り返すごとに1ずつ増えていきます。

このコードの実行結果は、

0
1
2

となります。

ここで見てもらうとわかるように、一発目のループのiは0となっていますね。ここが後々すごく重要なポイントとなります。
0,1,2合わせて3回出力されているのがわかります。range(3)と書いたからですね。

はじめとおわりを決めておくかきかた

for i in range(1,3):
    print(i)

実はこんな書き方もあります。
これの出力結果は

1
2

です。上のコードと見比べてみれば決まりがわかると思います。

発展 〜for文を重ねる〜

for文は重ねて書くことができます。まあ今のところはへーふーんそーなんだ程度に見てください。

for i in range(2):
    for j in range(3):
        print(i,j)

出力結果

0 0
0 1
0 2
1 0
1 1
1 2

ちょっと頭がこんがらがると思いますが、慣れるといけます!
(ちなみにfor文をたくさん重ねると実行時間が多くかかります。)

配列ってなんなんデイ!

配列(list)はざっくり言うと複数の要素をまとめて収納できる変数みたいなものです。

yasai = ["にんじん","だいこん","ごぼう"]

のように、要素がカンマ区切りで全体を[]で囲まれてできています。この場合でいうと、yasaiは3つ部屋があるホテルだと思ってください。
普通ホテルのひとつひとつの部屋にはそれぞれ部屋番号がありますね。配列も同じです。

配列は一番前の要素から順に、0,1,2....と番号がついています。この番号をindexといいます。

もう一度言います!!一番前の要素の番号は0!!!
さっきのiと同じです。めちゃめちゃ大事なポイントなのでおさえましょう。

index指定をやってみよう

yasai = ["にんじん","だいこん","ごぼう"]
print(yasai[1])

また、このように配列名[数字]と書くことで、配列のその番号の要素を取得することができます。
このコードの実行結果、わかりますか?

「にんじん」だと思った方いませんか?違いますよ!

だいこん

一番前の要素の番号は0、絶対に間違えないようにしましょう。

配列の長さはlen!

配列の長さはlen(配列)で取得することができます。

yasai = ["にんじん","だいこん","ごぼう"]
print(len(yasai))

出力結果

3

これもよく使います。覚えておきましょう。

ここまでのことをふまえて

あなたはこんなコードが書けるようになりました。

yasai = ["にんじん","だいこん","ごぼう"]
for i in range(len(yasai)):
    print(yasai[i])

出力結果↓

にんじん
だいこん
ごぼう

どうですか!ここまで理解できれば、C問題が解けるようになってきてます。わからなかったらもう一度上をよんでみてください。

for文を使った入力、配列の入力をやってみイェイ!(AtCoder)

AtCoderだとだいたいC問題あたりからforを使った入力が出てくると思います。
例えばこんな感じのやつです↓

C - Peaks

※問題の解き方の解説はしません。入力のやり方だけ説明します。

入力欄を見るとこういう風になっています。

意味がわからないかもしれません。私も最初は意味がわかりませんでした。特に添字。
でも上を理解できたならすぐわかるようになります。

N,M = map(int,input().split())
H = list(map(int,input().split()))
for i in range(M):
    A,B = map(int,input().split())

ジャジャーン。
listの入力の仕方はいつものmap()入力にlist()をかぶせるだけです。
下のfor文ではM回ループを回し、M回ぶんA、Bを入力しています。

ここでわかると思いますが、Pythonは配列の入力をするときに配列の長さの指定がいらないので、Nは入力の時にMのようには使わないです。かんたんですね。

入力の指定(灰色の画像参照)より、N == len(H)が成り立っています。

みんな大嫌い配列外参照 〜エラーメッセージを読もう〜

初学者がもっともイライラするエラーのひとつに、配列外参照があります。

yasai = ["にんじん","だいこん","ごぼう"]
print(yasai[3])

さて、こんなコードがあります。何が出力されるかわかりますか?

「ごぼう」と思った人が万が一にもいたらもう一度上のページに戻って私の言葉を心に刻みましょう。

答えは、「何も出力されない」です。エラーメッセージが出ます。

Traceback (most recent call last):
  File "Main.py", line 2, in <module>
    print(yasai[3])
IndexError: list index out of range

こんなエラーが出ます。

英語できなくても、落ち着いて読めば全然難しくありません。

line 2から、2行目のコードがおかしいのだとわかります。
IndexError: list index out of rangeを見てください。これが私がもっとも嫌いな(よく出してしまう)インデックスエラー、配列外参照です。

つまり、このエラーメッセージを読めば、「2行目のコードprint(yasai[3])のインデックスが配列の外を参照しているよ」ということがわかるわけです!

この配列外参照はパッと見単純なことのように見えますが、コードが複雑になってくると恐怖の配列外参照オンパレード地獄になります。気をつけましょう。

最後に

C問題まである程度の速さで解けるようになれば、確実に茶色コーダーを目指せます!
Pythonは書くコードが短くてよく基本速解きに向いた言語だし、何より読みやすいので、猛烈に時間かかった私がいうのもアレですが、茶色までなら比較的すぐ行けるかもしれません。

実行時間(競プロには実行時間の制限があります、なるべく効率の良いコードを書こうね〜ってことですね、詳しくはwebで)がいちばんの問題なのですが、計算量の色々は慣れればある程度までは体感でわかると思います。

頑張ってください!