for文とリストの賢い使い方4つ【Python】

253, 2021-05-19

目次

Pythonのfor文とリストの使い方

Pythonには繰り返し処理を書くためのfor文と、複数のデータをまとめるためのデータ型であるリスト(list)があります。
この2つを組み合わせて使うことで大量の処理をプログラムでさばくことが可能になります。

この記事ではfor文とリストについて解説します。
結論から言うとfor文とリストは↓のようにして使います。

lis = [1, 2, 3]  # リストを作る

for el in lis:  # for文でリストを回す
    print(el)  # 要素を出力
# 1
# 2
# 3

for文とリストについて具体的に↓を見ていきます。

  • for文でリストを回す

  • for文とリストとenumerate

  • for文とリストとzip

  • for文とリスト内包表記

for文でリストを回す

for文でリストを回してみたいと思います。

関連記事:
Pythonでforeach文と同じことをやる【for文】

for文でリストを回す場合は↓のようにコードを書きます。

for 要素 in リスト:
    処理

↑のようにfor文でリストを参照するにはinキーワードを使います。
↑の場合、リスト内の個別の要素が1つずつ先頭から要素として取り出されます。
処理ではその要素を使った処理を行います。

コードにすると↓のようになります。

lis = [1, 2, 3]

for el in lis:
    print(el)
# 1
# 2
# 3

lisという変数がリストです。
このlis[1, 2, 3]というリストが代入されています。
これをfor文でinの右側に置きます。
そうするとfor文はlisの先頭の要素(1)から順に後方に向かって(3に向かって)要素を取り出していきます。
取り出している要素はelです。
print()でこのelを出力すると、lisの要素の値が出力されます。

リストを後方から参照する

リストのスライス機能を使うと、リスト自体を逆順にすることができます。
これを利用するとfor文でリストの末尾から要素を参照することができます。

lis = [1, 2, 3]

for el in lis[::-1]:
    print(el)
# 3
# 2
# 1

スライスはリストの角カッコ無いをコロンで区切って指定します。
2つ目のコロンの後に-1を指定すると、リストを逆順にしてコピーすることができます。

添え字を使ってリストを参照する

先ほどの方法は添え字を使わない方法でしたが、添え字を使いたい場合は↓のようにコードを書きます。

for 添え字 in range(len(リスト)):
    print(リスト[添え字])

リストの長さ(全長、要素数)はlen()で取得できます。
このlen()で取得した値をrange()に渡します。
するとrange()0からその値までの整数を生成します。
それを↑の添え字に保存し、この添え字を使ってリストを参照します。
添え字の範囲は0からリストの長さ-1の範囲になるので、参照することでリストの要素を取り出せます。

関連記事:
Pythonのrangeのイマドキな使い方

コードにすると↓のようになります。

lis = [1, 2, 3]

for i in range(len(lis)):
    print(lis[i])
# 1
# 2
# 3

↑の場合、lisがリストです。このリストは[1, 2, 3]で初期化されていますが、リストの長さは3になります。
len()でリストの長さを取得し、それをrange()に渡し、iに添え字を取り出します。
iの値を出力してみます。

lis = [1, 2, 3]

for i in range(len(lis)):
    print(i)
# 0
# 1
# 2

↑のようにi0, 1, 2という整数になります。
この添え字ilisを参照すると、先頭の要素から順にリストの値を参照できるということになります。

添え字を使ってリストを後方から参照する

添え字を使ってリストを後方から参照する場合は↓のようにします。

lis = [1, 2, 3]

for i in range(len(lis) - 1, -1, -1):
    print(lis[i])
# 3
# 2
# 1

range()のところがちょっとごちゃごちゃっとしてますね。

range()の最初の引数には整数の生成の開始点を指定します。
↑ではlen(lis) - 1を指定してますが、これはリストの長さが3の場合は2になります。
つまり整数の生成を2から始めろと言う意味になります。

range()の第2引数には整数の生成の終了点を指定します。
-1にしていますが、これは-1になったら終了するという意味です。この時-1は含まれません。

range()の第3引数にはステップ数を渡します。
リストを逆順で参照したいので、開始点から-1ずつ増加、つまり1ずつ減らすようにステップ数を指定します。
このようにステップ数を指定することで開始点から1ずつ減っていき終了点に来たら生成を終了するrange()を書けます。

このrange()では添え字(i)は2, 1, 0と言う風に生成されます。
この添え字でlisを参照すると、後方の要素から順にリストを参照できるということになります。

for文とリストとenumerate

for文でリストを回す時に、要素と添え字を同時に取り出したい場合があります。
そういう場合はenumerate()を使います。

関連記事:
Pythonのenumerate()を使いこなす

enumerate()にリストを渡し、それをfor文で回すと、添え字と要素を両方取り出せます。
構造的には↓のようになります。

for 添え字, 要素 in enumerate(リスト):
    処理

コードにすると↓になります。

lis = [10, 20, 30]

for i, el in enumerate(lis):
    print(i, el)
# 0 10
# 1 20
# 2 30

enumerate()が展開する要素は(添え字, 要素)なので順番に注意が必要です。
添え字と要素を逆で覚えてしまうというのはあるあるです。

for文とリストとzip

2つのリストをzip()に渡すと各要素を1つのタプルとして回すことができます。

lis1 = ['a', 'b', 'c']
lis2 = [1, 2, 3]

for tup in zip(lis1, lis2):
    print(tup)
# ('a', 1)
# ('b', 2)
# ('c', 3)

↑の場合lis1の先頭の要素alis2の先頭の要素1が1つのタプルとして取り出せています。
各リストの先頭から順に要素を参照し、それをタプルにします。

タプルはfor文内で展開することが出来るので、↓のようにも書けます。

lis1 = ['a', 'b', 'c']
lis2 = [1, 2, 3]

for i, el in zip(lis1, lis2):
    print(i, el)
# a 1
# b 2
# c 3

for文とリスト内包表記

for文とリスト内包表記を組み合わせることも出来ます。
というかリスト内包表記はfor文とセットです。

lis1 = [1, 2, 3]
lis2 = [el * 2 for el in lis1]
print(lis2)
# [2, 4, 6]

↑のリスト内包表記は

[el * 2 for el in lis1]

の部分です。
このリスト内包表記はlis1を参照しています。
lisの要素を1つずつ取り出して、それを2倍にしています。
結果はリストとして返ってきます。

おわりに

今回はfor文とリストについて見てみました。
for文とリストは相性が良く非常によく使われる組み合わせと言えます。

リストは回るよどこまでも