「Pythonのリスト、辞書などデータ型によってfor文の書き方がわからなくなる」
「他人のコードで1行でまとめられた省略記法を見ることがあり何をやっているかわからない」
「特定の条件のみループして、それ以外はループさせないようなことをやる方法を知らない」
本日はそんな方に向けてPythonにおけるループの書き方を解説していきます。
Pythonにおけるループの構造や使い方は、初学者から経験豊富なプログラマまでどんなレベルの開発者にも欠かせないスキルです。
この記事では、Pythonのループに関するさまざまな側面に焦点を当て、for文からenumerate、zip、reversedまで、様々なループのテクニックを一挙に紹介します。
また、途中でのプロセスの制御に役立つbreakやcontinue、そしてコードをより簡潔かつ効率的に書くための内包表記についても解説します。
また動画もあるので必要に応じて活用してください。
Pythonにおけるリスト、辞書のforループの書き方
まずはリストのループですがfor-inというキーワードを使って以下のように書きます。
arr = [1,2,3,4,5]
for val in arr:
val = val + 1
print(val) #2,3,4,5,6と表示される
valという部分についてはリストarrの中の「1」「2」「3」「4」「5」という一つの要素が代入される引数になります。
valというキーワードにしましたが自分の好きなキーワードにして大丈夫です。
ちなみにrangeに対しても同じ書き方ができますが、rangeはインデックス番号で数字が作られるので「0」から始まることを注意してください。
for i in range(10):
print("順番は", i + 1)
「1」から始まるカウントをしたいときは引数に1を足すようにすればOKです。
for i in range(10):
print("順番は", i + 1)
続いて辞書ですがキーと値があり、それぞれ専用のメソッドを使うことで中身を取り出して繰り返し処理を実行することができます。
studentA = {
"id": "0001",
"name": "tanaka",
"age": 20
}
# 辞書のプロパティをループ
for key in studentA.keys():
print(key) # id, name, ageと表示される
# 辞書の値をループ
for val in studentA.values():
print(val) # 0001, tanaka, 20と表示される
# 辞書のプロパティと値をループ
for key, val in studentA.items():
print(key, ":", val) # id:0001, name: tanaka, age: 20と表示される
Pythonで特定の条件のみループさせたい時
前章のように中身を全て同じ処理をさせるのではなく特定の要素のみに処理をしながらループさせたい時があります。
例えばリストで特定のインデックス番号だけを処理したいときは以下のようにenumerateというメソッドを使用します。
arr = ["a","b","c","d","e"]
for index, val in enumerate(arr):
if index == 0:
print("0番目です") # 0番目ですと表示される
こちらは0番目つまり「a」のみにprintを実行した例です。
インデックス番号0番目に該当しない他の要素については何も処理が行われていないように見えますね。
実際にはループ自体は回っているので確認作業を含めると全ての要素を引数に代入することは実行されています。
その証拠としてelse文を追加して以下のコードを実行してみます。
arr = ["a","b","c","d","e"]
lastIndex = len(arr) - 1;
for index, val in enumerate(arr):
if index == lastIndex:
print("最後は", val, "です")
else:
print("実行中です")
「実行中です」というelse文が4回表示されて、if文の文章と合わせると全体で5回のprintが実行されていますね。
つまりリストarrの中身は一応すべて回されているわけです。
ちなみに条件に該当しないものは実行して欲しくない場合があります。
基本的にループというのは負荷がかかり回数が増えると実行して完了するまでの時間が長くなることがあるためです。
Pythonではbreakというキーワードを書くと、break以降を強制的にストップさせることができて、for文の中で以下のように書くことができます。
# 条件を満たした時点でループを終了させる
arr = [1,2,3,4,5]
for val in arr:
if val == 4:
print(val, "を見つけた")
break
# 4を見つけたと表示される
こちらを実行すると「4」の部分のみが条件に該当します。
先ほどのように引数のprintも追加して条件に該当しなかった要素がどうなっているか確認してみましょう。
arr = [1,2,3,4,5]
for val in arr:
# ここを追加
print(val)
if val == 4:
print(val, "を見つけた")
break
今度は「5」だけがprint(val)の部分で表示されていません、つまり「4」が条件に該当してbreakまで辿り着いているためです。
breakは一度読み込まれるとループの途中であったとしても停止するようになっています。
breakの反対で条件に該当したものが見つかっても最後までやるものとしてcontinueがあります。
arr = [1,2,3,4,5]
for val in arr:
print(val)
if val != 4:
continue
else:
print(val, "を見つけた")
こちらは「4」が条件に該当しましたが、「5」まで実行されてループが終了していることがわかります。
条件をfor文の中で書くときに「最後までやるか」というのは考える意識を持っておきましょう。
Pythonにおける内包表記について
Pythonの条件付きのループでは内包表記という記法があります。
こちらは短く書くことが特徴になっていて他人のコードで以下のようなものを見かけるかもしれません。
arr =[ 1,2,3,4,5]
evenArr = [val + 1 for val in arr]
print(evenArr) # [2,3,4,5,6]と表示される
こちらは以下と同じ内容になります。
arr = [1,2,3,4,5]
evenArr = []
for val in arr:
evenArr.append(val + 1)
print(evenArr) # [2,3,4,5,6]と表示される
同じループでも内包表記という書き方の方が短いので、コードの簡素化を目的に取り入れる人が一定数います。
皆さんも使わないとしても読めるようにはなっておくと良いでしょう。
内包表記はループのなかでif文を書くときに使うことが多く、そもそもループのなかでif文を書くと長くなりやすいからですね。
arr = [1,2,3,4,5]
evenArr = [val for val in arr if val % 2 == 0]
print(evenArr) # [2,4]と表示される
こちらはリストarrの中の要素で偶数のものだけを表示するものです。
内包表記ではループの後ろで条件分岐を書くことになります。
もちろん辞書についても内包表記を使うことができて書き方はリストと同じです。
students = {
"tanaka": 1,
"yoshida": 2,
"kimura": 3,
"yamada": 4,
"sato": 5
}
allStudents = {key: value for key, value in students.items()}
print(allStudents)
# {'tanaka': 1, 'yoshida': 2, 'kimura': 3, 'yamada': 4, 'sato': 5}と表示される
こちらはstudentsの中身を全て取り出すループです。
リストと同じく条件分岐を足して「偶数の番号を持つもの」だけを表示させてみます。
students = {
"tanaka": 1,
"yoshida": 2,
"kimura": 3,
"yamada": 4,
"sato": 5
}
# ここを変更
evenStudents = {key: value for key, value in students.items() if value % 2 == 0}
print(evenStudents)
# {'yoshida': 2, 'yamada': 4}と表示される
Pythonにおけるいろんなループ
他にもPythonでは特別なループを実行できるメソッドが用意されています。
例えば順番を逆にしてループさせるにはreversedというメソッドがあります。
arr = ["a","b","c"]
for val in reversed(arr):
print(val) # c,b,aと表示される
こちらはスライスを使っても同じことができますがreversedの方が初心者の方は覚えやすいかと思います。
arr = ["a","b","c"]
for val in arr4[::-1]:
print(val) # c,b,aと表示される
他には2つのリストを同時にループさせたい場合があり、zipというメソッドを使うと実現できます。
arr1 = [1,2,3]
arr2 = [4,5,6]
for one, two in zip(arr1, arr2):
print(one, two)
#以下のように表示される
1 4
2 5
3 6
zipの注意点としては2つのリストで中身の数が違う場合、中身が少ない方の回数しかループされません。
arr1 = [1,2,3]
# ここを変更
arr2 = [4,5]
for one, two in zip(arr1, arr2):
print(one, two)
#以下のように表示される
1 4
2 5
Pythonには便利なメソッドがたくさんありますので積極的に使っていきましょう。