python入門講座 | ループ処理4(listに対するループ)[第41回]

アラサーOLのためのpython入門講座
いくつか方法があるので頭に入れておくと効率よくコーディングできます!

Ciao!みなさんこんにちは!このブログでは主に
(1)pythonデータ解析,
(2)DTM音楽作成,
(3)お料理,
(4)博士転職
の4つのトピックについて発信しています。

今回は「アラサーOLのためのpython入門講座」シリーズ第41回です!この講座では、プログラミング初心者アラサーOLのMi坊さんに、pythonを学習する上でのアドバイスを行います!「パソコンもプログラミングも初心者だけど、プログラミングができるようになりたい!」という方のためにstep-by-stepで解説していきます。

Pythonのプログラミングでは、for文を使ってlist型変数に対してループ処理を行うことがしばしばあります。List型変数に対してfor文を適用する方法はいくつかあります。場面に応じて使い分けることで、効率的なコードが書けます!実戦で頻出のテクニックなのでマスターしましょう!

この記事を読めば、pythonでlist型に対するループ処理の書き方を知ることができます。ぜひ最後までお付き合いください!

Kaiko
Kaiko

この記事はこんな人におすすめ

  • 初心者だけどpythonを始めた!
  • pythonの基本的な使い方を知りたい!
  • 独学で学んだpythonの知識を整理したい!

Abstract | List型変数に対するループ

Pythonプログラミングでlist型変数に対してループ処理を行う場面は多々あります。List型変数に対してループをかける方法はいくつかあります。今回は

  1. for文の対象を変数自体にしてlist型変数の値をループ
  2. for文の対象をrange(len(変数))としてlist型変数のindexをループ
  3. for文の対象をenumerate(変数)としてindexと値の両方をループ

という3つの方法をご紹介します。for文の中の処理で値だけを参照する場合は方法1、indexも参照したい場合は方法2か方法3などと、目的によって使い分けることで効率よくコーディングできます。やってみてください!



Background | ループ処理とfor文

ループ処理とは、同じ処理を一定回数繰り返すことです。Listなど配列タイプの変数のすべての要素や一部の要素に同じ処理を行いたいとき、一回一回の処理をいちいち書き下すことなく、いっぺんに処理することができます。ループ処理はPythonに限らずプログラミングで不可欠な処理です。

Pythonではfor文やwhile文を使ってループ処理を実装することができます。for文では予め繰り返し処理を行う回数が決まっています。一方、while文では繰り返しの範囲が決まっておらず、ある条件を満たしたら処理を終える、逆に言うと条件を満たすまでは延々と処理が繰り返されます。

今回はfor文をlist型変数に適用するテクニックをご紹介します!for文については以下の過去記事もありますので、参考にご覧ください。

  1. for文の基礎: python入門講座 | ループ処理1(for文の基本的な使い方)
  2. for文の実戦的な使い方: python入門講座 | ループ処理2(for文とrange()で実戦的なループ処理)[第39回]
  3. for文の中断: python入門講座 | ループ処理3(breakまたはcontinueでループを中断)



Method | list型変数に対してループする方法

for文を使ってlist型変数についてループする方法を解説します。実際に手を動かしながら学んでいきましょう!Jupyter Notebookを立ち上げてコーディングしながら読み進めてください。練習問題の後にコーディング例も掲載しますので、やってみてどうしてもわからなければそれを見て進めてください。



準備 | python notebookの新規作成

まずはpython notebookを用意しましょう。いつものpython_practiceのディレクトリに「practice_for_list」という名前のpython notebookを作成してください。ターミナルを立ち上げて~/python_practiceに移動、jupyter notebookを起動し、ブラウザから新規→Python3でpython notebookを開いて、ファイル→リネームでファイル名を決定します。
もしやり方がわからなければ、過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」で詳しく解説しているので、これを見ながらやってみてください。

python notebookを起動したら、適宜Markdownセルに説明書きを加えながら下記の説明に沿ってコードを書いて実行していきましょう。Markdownセルやコードセルなどの用語やこれらの使い方についても、過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」を参照してください。練習問題の後にpython notebookの例を掲載します。もし書き方がわからなければそちらを見てください。



1次元のlist型変数に対するループ

まずはシンプルに1次元のlistについてループする方法を扱います。今回は3つの方法をご紹介します。

  1. list型変数の値をループ
  2. range(len())でlist型変数のindexをループ
  3. enumerateでindexと値の両方をループ

個人的には2番目の方法が汎用性が高く使いやすいです。それぞれを見ていきます。



方法1: list型変数の値をループ

for文の対象をlist型変数自体に設定することで、list型変数の値についてループすることができます。この方法は、for文の中の処理で値だけ取り出せれば済むときに使いやすいです。以下の例を実行してください。

# define a list variable
var = ['python', 'R', 'C', 'fortran']

# loop for the variable's value
for v in var:
    print(v)

この例では、最初にlist型変数varを定義し、その要素(値)についてループしています。for文では仮変数vに変数うvarの値が一つずつ代入されていきます。実行結果は以下となります。

python
R
C
fortran

この方法では、変数vを参照すれば変数varの値を直接取得することができるため、list型変数の値自体をすぐに参照ことがメリットです。逆にindexが取得できないことがデメリットです。現在のループで何番目の値を扱っているのかを知りたいときには使いにくいです。



方法2: range(len())でlist型変数のindexをループ

for文の対象をrange(len(対象の変数))とすることで、対象のlist型変数のindexについてループすることができます。for文の中の処理でindexを取り出したいときに使いやすい方法です。Indexが取り出せれば値もすぐに取り出せるため、実際のプログラミングの場面ではこれで事足ります。以下を実行してみてください。

# define a list variable
var = ['python', 'R', 'C', 'fortran']

# loop for the variable's index
for i in range(len(var)):
    print(i, var[i])

この例では、for文の対象をrange(len(var))とすることで、変数varのindexについてループしています。仮変数iにはindexが一つずつ代入されていきます。実行結果は以下です。

0 python
1 R
2 C
3 fortran

この方法では変数iにindexが代入されるため、indexをすぐに参照できるメリットがあります。現在の処理が何番目の要素に対して行われているのかを知りたいときには便利です。逆に、値を参照するにはもとのlist型変数を使って”var[i]”とする必要があります。方法1よりは手数が増えることがデメリットといえばデメリットですが、大した手間ではないです。

本記事の後半で高次元のlistの場合も扱いますが、方法2は高次元のlistの場合でも同じように書くことができます。汎用性の高い方法なので覚えておくと便利です。



方法3: enumerate()でindexと値の両方をループ

for文の対象をenumerate(list型変数)とすることで、list型変数のindexと値を両方取り出しながらループすることができます。for文の中の処理でindexと値の両方が必要な場合に使うメリットがあります。ただ、方法2のようにindexだけ取り出せれば十分なので個人的には実戦で使う場面は少ないです。

この方法では、for文の仮変数を2つ(この例ではiとv)にする必要があることに注意しましょう。以下の例をやってみてください。

# define a list variable
var = ['python', 'R', 'C', 'fortran']

# loop for the variable's index and value
for i, v in enumerate(var): # take 2 local variables
    print(i, v)

この例では、for文の対象をenumerate(var)としています。仮変数iには変数varのindexが代入うされていきます。同時に仮変数vには変数varの値が代入されていきます。実行結果は以下です。

0 python
1 R
2 C
3 fortran

結果だけ見ると方法2と同じです。



List in list(高次元のリスト)に対するループ

高次元のリストすなわちlist in listに対してループする例も取り上げておきます。例として、果物の名前、単価、仕入れ個数の3列の表形式のlist型変数を扱います(実際にはこのような表形式のデータはlist型ではなくPandas DataFrameやNumpy arrayで扱うことが多いです)。以下を実行して変数を定義しておきましょう。

# define a 2 dimensional list: fruite, price, number
list_2d = [
    ['apple', 100, 20],
    ['orange', 130, 30],
    ['grape', 250, 15]
]



方法1: list型変数の値をループ

for文の対象をlist型変数自体にする方法でループしてみましょう。以下のように書きます。以下を実行してみてください。

# loop for 0th axis
for v0 in list_2d:
    # v0 is a 1d list
    print('v0:', v0)
    
    # loop for 1st axis
    for v1 in v0:
        # v1 is a value
        print('-- v1:', v1)

この例では、1段目のfor文の仮変数v0には変数list_2dの値、list_2d[0]などが代入されていきます。すなわち仮変数v0は[‘apple’, 100, 20]といった1次元のlist型変数となります。2段目のfor文の対象はこのlist型変数v0となります。このようにすることで、仮変数v1にlist型変数v0の値が代入されます。実行結果は以下です。

v0: ['apple', 100, 20]
-- v1: apple
-- v1: 100
-- v1: 20
v0: ['orange', 130, 30]
-- v1: orange
-- v1: 130
-- v1: 30
v0: ['grape', 250, 15]
-- v1: grape
-- v1: 250
-- v1: 15

方法1はlist型変数の値が一発で取得できるシンプルな方法ですが、高次元になったときに1段目のfor文の書き方と2段目以降のfor文の書き方が整合しない問題があります。以下で紹介する方法2の方が可読性の高い書き方となります。



方法2: range(len())でlist型変数のindexをループ

for文の対象をlist型変数のindexにする方法でループしてみましょう。以下のように書きます。以下を実行してみてください。

# loop for 0th axis
for i0 in range(len(list_2d)):
    
    # loop for 1st axis
    for i1 in range(len(list_2d[i0])):
        # print value at [i0][i1]
        print(i0, i1, list_2d[i0][i1])

1段目のfor文の対象はrange(len(list_2d))なので、仮変数i0には、2次元list型変数list_2dの0次元目のindexが代入されていきます。2段目のfor文の対象はrange(len(list_2d[i0]))、すなわちi0番目の1次元list型変数です。こうすることで、仮変数i1には1次元のlist型変数であるlist_2d[i0]のindexが代入されていきます。list_2d[i0][i1]とすることで、現在のindex i0とi1の値を参照することができます。実行結果は以下です。

0 0 apple
0 1 100
0 2 20
1 0 orange
1 1 130
1 2 30
2 0 grape
2 1 250
2 2 15

方法2ではfor文の対象がわかりやすいメリットがあります。更に高次元になった場合にも同じ書き方ができ汎用性が高いです。私自身はlist型変数に対するループは基本的にこの方法を使っています。



方法3: enumerate()でindexと値の両方をループ

for文の対象をenumerate(list型変数)とする方法でループしてみましょう。以下のように書きます。以下の例を実行してみましょう。

# loop for 0th axis
for i0, v0 in enumerate(list_2d): # take 2 local variables
    print('i0, v0:', i0, v0)
    
    # loop for 1st axis
    for i1, v1 in enumerate(v0):
        print('-- i1, v1:', i1, v1)

書き方は方法1と似ています。for文の対象は、方法1では変数自身でしたが方法3ではenumerate(変数)となります。1段目のfor文では変数list_2d、2段目では仮変数v0となるのも方法1と同じです。 実行結果は以下となります。

i0, v0: 0 ['apple', 100, 20]
-- i1, v1: 0 apple
-- i1, v1: 1 100
-- i1, v1: 2 20
i0, v0: 1 ['orange', 130, 30]
-- i1, v1: 0 orange
-- i1, v1: 1 130
-- i1, v1: 2 30
i0, v0: 2 ['grape', 250, 15]
-- i1, v1: 0 grape
-- i1, v1: 1 250
-- i1, v1: 2 15



Result | 練習問題

練習問題をやってみましょう。以下の処理を行うコードを書いてみましょう。

  1. 変数var_listにMac, iPad, iPhoneの3つの文字列をlistとして代入してください。
  2. for文を使って、変数var_listの値を一つずつprint文で出力してください。
    ただし、方法1、方法2、方法3それぞれの方法を実行してください。方法2と方法3では値と一緒にindexを出力してください。



練習問題の回答例

練習問題の回答が完成したら回答例を確認しましょう!下の画面をスクロールすると回答例が見られます!参考にしてみてください。また、今回の記事で出てきた他のコードも載っているので参考にしてください!

練習問題おつかれさまでした!
今日はここまでです。Python Notebookを終了しておきましょう。もしPython Notebookを終了方法がわからなければ過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」の「Python Notebookの起動・終了方法」の章を参照してください!



Conclusion | まとめ

最後までご覧いただきありがとうございます!
List型変数にfor文を適用してindexや値を参照する方法を解説しました。実戦でもよく使うテクニックです。今回紹介した3つの方法をぜひ覚えてマスターしましょう!

以上「python入門講座 | ループ処理4(listに対するループ)」でした!
またお会いしましょう!Ciao!



References | 参考

以下の教科書を参考にして進めています!より詳しく学びたい方は購入して読んでみてください!

Pythonの参考教科書

コメント

タイトルとURLをコピーしました