どん底から這い上がるまでの記録

どん底から這い上がりたいけど這い上がれない人がいろいろ書くブログ(主にプログラミング)

Pythonのfor文の基本的な使い方から range, zip, enumerateそしてリスト内包表記

 

本記事ではPythonのfor文の使い方についてまとめていきます。

記事の最後にはfor文の使い方について理解できているかの確認のために簡単な問題を載せています。

  

 

for文の基本的な使い方

for文はイテラブルオブジェクト(リスト、タプル、辞書、文字列など)から要素をひとつずつ取り出して処理することができます。

for文の書き方は、

for 変数名 in イテラブルオブジェクト:
    取り出した要素に何かする

 

  • リスト
sample = ['ウ', 'ホ', 'ウ', 'ホ']
for element in sample:
    print(element)
"""結果




"""

 

  • タプル
sample = ('ウ', 'ウ')
for element in sample:
    print(element, end="ホ")
print()
"""結果
ウホウホ
"""

 

  • 辞書
sample = {'1': 'python', '2': 'python', '3': 'python'}
for key, value in sample.items():
    print("{}位は{}です".format(key, value))
"""結果
1位はpythonです
2位はpythonです
3位はpythonです
"""

 

  • 文字列
sample = "今度の日曜日は彼女とディズニーランドに行くことにしよう。あ、彼女いないんだった。"
for character in sample:
    print(character)
"""結果
悲しい事実だから省略
"""

range, zip, enumerate

for文はrange関数, zip関数, enumerate関数などと組み合わせることで便利な使い方ができます。

range関数

range関数はrange(start, end, step)という形式になっており、指定した範囲の値を取得できる。startstepは省略できるがendは必ず指定する必要がある。

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

"""結果
0
1
2
"""

startを省略すると0から始まり、end-1までの値を取得できる。

stepはデフォルトで1になっていて、この値をいじることにより偶数のみの値を取得したり逆順で取り出したりできる。

for i in range(0, 5, 2):
    print(i, end=" ")
print()

"""結果
0 2 4
"""

 

逆順で取り出すにはstepに負の値を渡す。

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

"""結果
3
2
1
"""

zip関数

zip関数を使うと複数のイテラブルオブジェクトを並列的に処理することができる。

students_name = ["Bob", "John", "Gorilla"]
students_id = ["s1200001", "s1200002", "s1200003"]
for name, id in zip(students_name, students_id):
    print("{} {:>7s}".format(id, name))

"""結果
s1200001     Bob
s1200002    John
s1200003 Gorilla
"""

 

なお、長さが異なるイテラブルオブジェクトをzip関数に渡した場合、その中で一番サイズが小さいイテラブルオブジェクトを処理し終えたときにzip関数は終了する。

students_name = ["Bob", "John"]
students_id = ["s1200001", "s1200002", "s1200003"]
for name, id in zip(students_name, students_id):
    print("{} {:>7s}".format(id, name))

"""結果
s1200001     Bob
s1200002    John
"""

enumerate関数

enumerate関数にイテラブルオブジェクトを渡してfor文を使うと、イテラブルオブジェクトの要素とそのインデックスを取得することができます。

for文の一つ目に書かれたiがインデックスが入り、二つ目に書かれたnameにリストの要素が入っている。

team = ["巨人", "阪神", "中日", "近鉄", "ヤクルト", "広島"]
for i, name in enumerate(team):
    print("{}位: {}".format(i+1, name))

"""結果
1位: 巨人
2位: 阪神
3位: 中日
4位: 近鉄
5位: ヤクルト
6位: 広島
"""

enumerate関数はrange関数と同様に0から始まりイテラブルオブジェクトのサイズー1までの値を取得でき、さらに開始インデックスも指定できます。

japanese = ["蓮〇", "〇舫"]
# 開始インデックスは第二引数に任意の値を指定する。負の値でもOK!
for i, name in enumerate(japanese, 2):
    print("{}: 「{}位じゃだめなんですか?」".format(name, i))
else:
    print("だめです。")

"""結果
蓮〇: 「2位じゃだめなんですか?」
〇舫: 「3位じゃだめなんですか?」
だめです。
"""

breakとcontinue

ある条件を満たしたときにループを終了させたいときは、break文を使います。

x = [2, 3, 61, -1, 13]
for v in x:
    if v == -1:
        break
    print(v)

"""結果
2
3
61
"""

 

ある条件を満たしたときに、そのステップの残りの処理をせずに次のステップの処理に移りたい場合はcontinueを使う。

x = [2, 3, 61, -1, 13]
for v in x:
    if v == -1:
        continue
    print(v)

"""結果
2
3
61
13
"""

for else文

for文が終了したときに何らかの処理をしたいときはelse文が使える。

japanese = ["蓮〇", "〇舫"]
for i, name in enumerate(japanese):
    print("{}: 「{}位じゃだめなんですか?」".format(name, i+2))
else:
    print("だめです。")

"""結果
蓮〇: 「2位じゃだめなんですか?」
〇舫: 「3位じゃだめなんですか?」
だめです。
"""

 

break文を使ってfor文が途中で終了したときはelse文が実行されない。

japanese = ["蓮〇", "〇舫"]
for i, name in enumerate(japanese):
    print("{}: 「{}位じゃだめなんですか?」".format(name, i+2))
    if i+2 == 2:
        break
else:
    print("だめです。")

"""結果
蓮〇: 「2位じゃだめなんですか?」
"""

リスト内包表記

リスト内包表記を使うとfor文をシンプルに書くことができ、次のように書きます。

[要素に何らかの処理 for 変数名 in イテラブルオブジェクト]

例えば、20以下の2の倍数が入ったリストを用意するにはふつうに書くと、

l = []
for v in range(2, 21, 2):
    l.append(v)
print(*l)

"""結果
2 4 6 8 10 12 14 16 18 20
"""

 

リスト内包表記にすると

l = [v for v in range(2, 21, 2)]
print(*l)

"""結果
2 4 6 8 10 12 14 16 18 20
"""

 

与えられた要素を2倍したいときは、

l = [v*2 for v in range(2, 21, 2)]
print(*l)

"""結果
4 8 12 16 20 24 28 32 36 40
"""

 

10で割り切れる要素をリストに入れたくないときは、

l = [v*2 for v in range(2, 21, 2) if v%10]
print(*l)

"""結果
4 8 12 16 24 28 32 36
"""

ここでやっていることは、与えられた要素が10で割ったときに余りがあるものを2倍してリストに入れています。

 

10で割り切れるものは2倍、割り切れないものは3倍したいときは、

l = [v*2 if v%10 == 0 else v*3 for v in range(2, 21, 2)]
print(*l)

"""結果
6 12 18 24 20 36 42 48 54 40
"""
[if文がTrueのとき if 条件式 else if文がFalseのとき for 変数名 in イテラブルオブジェクト]

if文はfor文の後に書きましたが、if-else文はfor文の前に書きます。

二重リスト内包表記?

なんて呼ぶのかわからないけどこういうやつ。

l = [[1, 2, 3], [1, 2, 3]]
print(l)
"""結果
[[1, 2, 3], [1, 2, 3]]
"""

これをリスト内包表記を使って作るには、

l = [[i+1 for i in range(3)] for _ in range(2)]
print(l)
"""結果
[[1, 2, 3], [1, 2, 3]]
"""

問題

▶をクリックすればヒントや解答例が見れるようになっています。

(例)ここをクリックすると中身が見れます。(^^

問題①

  • 次のような2つのリストx, yが与えられたとき、for文を使って私はゴリラです。と最後に改行を入れて1行で出力してください。
x = ['私', 'ゴ', 'ラ', 'す']
y = ['は', 'リ', 'で', '。']
ヒント①zip()を使う。
ヒント②print関数の引数endをどうすればいい? print関数についての記事はこちら
解答例
x = ['私', 'ゴ', 'ラ', 'す']
y = ['は', 'リ', 'で', '。']

for cx, cy in zip(x, y):
    print(cx + cy, end='')
else:
    print()

出力結果

> python question1.py
私はゴリラです。
>

問題②

  • 次のようなリストが与えられたとき、for文を使って偶数のみを出力してください。このときif文を使うのは禁止です。
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ヒント①range()を使う。
解答例
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in range(1, len(x), 2):
    print(x[i])

出力結果

> python question2.py
2
4
6
8
10
>