for文とリストの賢い使い方4つ【Python】
- 作成日: 2021-05-19
- 更新日: 2023-12-26
- カテゴリ: Python
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文とリスト内包表記
- 5.1 list — データ構造 — Python 3.9.4 ドキュメント
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
↑のようにi
は0
, 1
, 2
という整数になります。
この添え字i
でlis
を参照すると、先頭の要素から順にリストの値を参照できるということになります。
添え字を使ってリストを後方から参照する
添え字を使ってリストを後方から参照する場合は↓のようにします。
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
の先頭の要素a
とlis2
の先頭の要素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
```<!-- TODO: link to zip -->
<h1 id="for文とリスト内包表記">for文とリスト内包表記</h1>
`for`文とリスト内包表記を組み合わせることも出来ます。
というかリスト内包表記は`for`文とセットです。
```python
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
文とリストは相性が良く非常によく使われる組み合わせと言えます。
🦝 < リストは回るよどこまでも