こんにちは。
これから2回に分けてPythonのシーケンス型のうちの1つであるリスト(list)について説明していきます。今回は1回目になります。
本記事の学習内容
- シーケンス型について
- リストの作り方
- リストの値の参照の仕方
- リストの要素数(長さ)の確認方法
- リストに追加、削除、更新の方法について
- リストの繰り返し処理について
- リストについての課題【前編】
では、早速学習していきましょう。
シーケンス型とは
シーケンス型とは、順番を持つデータの集合体を意味します。イメージとしては配列と考えて頂いて問題ありません。
リスト変数 = [データ1, データ2, ……, データN]
基本的なシーケンス型は以下の3つで、ミュータブル(可変)、イミュータブル(不変)があります。
リストがミュータブル(可変)で、他二つがイミュータブル(不変)になります。
シーケンスの基本的な型3つ
- リスト(list)
- タプル(tuple)
- range
この中でもリストはかなりの頻度で使いますので、しっかり習得していきましょう。なお、Pythonの公式ドキュメントは以下になります。
リストの作り方
まずはリストの作り方から見ていきましょう。
リストの基本的な作り方
リストの基本的な作り方は [ ]
で囲った中にデータを入れていくことです。
データは ,
で区切ります。
下記に空、数値、文字列の順にコード例を記載します。
In[]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 空 list_empty = [] print(list_empty) # 数値 list_num = [1, 2, 3, 4] print(list_num) # 文字列 list_str = ['dog', 'cat'] print(list_str) # 数値、文字列の混合 list_mix = [1, 'dog', 2, 'cat'] print(list_mix) |
Out[]
1 2 3 4 | [] [1, 2, 3, 4] ['dog', 'cat'] [1, 'dog', 2, 'cat'] |
タプル,range からリストに変換する方法
シーケンス型にはリスト以外にもタプル、rangeなどがありますが、これらはイミュータブル(不変)なのでデータの追加などができません。
タプル、range については以下の記事を参考にしてください。
【Python】タプルの使い方【基本から応用まで】
続きを見る
【Python】セット(集合体)の使い方のまとめ【基本から応用まで】
続きを見る
データの変更ができるリストに変換したい場合、 タプル変数など を list()
で囲って、新しい変数に入れます。
タプルからリスト型に変換する際のポイント
リスト変数 = list(タプル変数)
以下のコードで確認してみましょう。
まず、タプルのリスト型への変換です。
タプルは [ ]
ではなく、( )
でデータを囲います。変換されているか、typeメソッドで型の確認も一緒にしてみましょう。
In[]
1 2 3 4 5 | tuple_samp = (1, 2, 3, 4) print(type(tuple_samp)) #型の確認 list_samp = list(tuple_samp) print(list_samp) print(type(list_samp)) #型の確認 |
Out[]
1 2 3 | <class 'tuple'> [1, 2, 3, 4] <class 'list'> |
きちんとリスト型に変換されていることが分かります。
続いて、range
の変換です。同様に type
で型の変換がきちんと出来ているのかを確認してみましょう。
rangeは()
に数字を入れることで、0~ 入れた数字-1
の値を作ってくれます。
range(4)
だと [0, 1, 2, 3]
が作られます。
In[]
1 2 3 4 5 | range_samp = range(4) print(type(range_samp)) #型の確認 list_samp = list(range_samp) print(list_samp) print(type(list_samp)) #型の確認 |
Out[]
1 2 3 | <class 'range'> [0, 1, 2, 3] <class 'list'> |
2次元(多次元)
シーケンス型はリストにリストを入れることで、2次元または多次元のデータにすることができます。
実際にコードで確認していきましょう。リストを作って、リストに入れていきます。
In[]
1 2 3 4 5 | list_0 = [1, 2, 3] list_1 = [4, 5, 6] list_2 = [7, 8, 9] list_two_dim = [list_0, list_1, list_2] #リストをリストに入れる print(list_two_dim) |
Out[]
1 | [[1, 2, 3], [4, 5, 6], [7, 8, 9]] |
下記でも同じことになりますので、同様に確認してみてください。
In[]
1 2 3 4 | list_two_dim = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(list_two_dim) |
Out[]
1 | [[1, 2, 3], [4, 5, 6], [7, 8, 9]] |
リストの値の参照
リストに入っているデータを使えるように、参照方法について説明します。
そのためにも、まず、リストの要素 No(index)
について確認していきます。
要素Noはリストの何番目にデータがあるかの番号で、0から始まります。
下記例では、水色が1次の要素Noで、緑色が2次の要素Noを表しています。
例えば、1次元変数の要素No0は1の値、2次元変数の要素No0 , 1 は2の値です。
2次元配列は下記と同じことなので、感覚的にわかりやすいほうで把握してください。
リストの値を要素Noで参照する方法
リストの値を使いたいときは、[要素No]と指定するだけです。
要素Noで参照する際の記術ルール
- リスト変数[要素No]
下記コードで確認してみましょう。要素Noの0番目の1を取得しています。
In[]
1 2 | list_num = [1, 2, 3, 4] print(list_num[0]) |
Out[]
1 | 1 |
リストの値を要素Noの-1,-2…で指定する方法
次は要素Noにマイナスの値を指定しる方法を解説します。
要素Noはゼロ~(以上)では?と思われるかもしれませんが、リストの末尾から参照する場合は、-1、-2… と記述します。
リストの最後の値をさっと参照したい場合に-1をよく使います。
横にうっすら同じ配列があると考えると、要素Noゼロから逆に-1,-2,となるイメージが掴めるかと思います。
では実際に確認してみましょう。[0, 1, 2]
に対して -1
と -2
を指定して、配列の後ろ2つの値を取得します。
In[]
1 2 3 | list_num = [0, 1, 2] print(list_num[-1]) print(list_num[-2]) |
Out[]
1 2 | 2 1 |
スライスの使い方
スライスという方法を使用すると、指定範囲の要素を取り出すことができます。
スライスの記述ルール
- リスト変数[開始要素No: 終了要素No]
- リスト変数[開始要素No: 終了要素No: 増分]
但し、以下の点について注意です。
ココに注意
終了要素Noまでのデータが取得できるのではなく、終了要素Noの1つ前までの範囲で取得される点に注意しましょう。
では、コードで確認してみましょう。0~9の数字のリストを用意して、1番目から4番目を取り出すとしましょう。
その場合、4番目の次の要素Noの「5」を指定する必要があります。
In[]
1 2 | list_num = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(list_num[1:5]) |
Out[]
1 | [1, 2, 3, 4] |
増分を指定すると、指定した増分の間隔でデータを取得するので、下記の様に奇数のみを取得することもできます。
In[]
1 2 | list_num = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(list_num[1:10:2]) |
Out[]
1 | [1, 3, 5, 7, 9] |
2次元(多次元)のデータのリストの参照方法
次は2次元(多次元)のデータの参照方法です。
2次元の場合はリスト変数[1次の要素No][2次の要素No]とすることで値を取得することができます。
2次元のリストのデータの参照方法
- リスト変数[1次の要素No][2次の要素No]
In[]
1 2 3 4 5 | list_two_dim = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # 1次元の0番目、2次元の1番目を取得 print(list_two_dim[0][1]) |
Out[]
1 | 2 |
1次元と2次元の要素Noの場所で混乱する方は以下の様に理解しましょう。
要素Noの説明図をもう一度見ていただくか、下記のように、いったん2次元のリスト変数から1次の要素を取得して、別の変数に入れていくと理解しやすいです。
In[]
1 2 3 4 5 | # 1次元の0番目取得 temp_one_dim = list_two_dim[0] print(temp_one_dim) # 2次元の1番目を取得 print(temp_one_dim[1]) |
Out[]
1 2 | [1, 2, 3] 2 |
リストの要素数=長さを確認する方法
リストの要素数を確認する方法として、特にlenは頻用します。
len の記述の方法
- len(リスト変数)
In[]
1 2 | list_num = [0, 1, 2, 3, 4] print(len(list_num)) |
Out[]
1 | 5 |
2次元(多次元)はどうなのでしょうか?下記で確認してみましょう。
In[]
1 2 3 | list_two_dim = [[1, 2, 3], [4, 5, 6]] print(len(list_two_dim)) |
Out[]
1 | 2 |
2となり、1次元の要素数を返していることがわかります。
maxの使い方
max
はリストの最大の値の要素を取得します。
max の記述のルール
- max(リスト変数)
In[]
1 2 | list_num = [0, 4, 1, 3, 2] print(max(list_num)) |
Out[]
1 | 4 |
続いて2次元(多次元)も説明したいところですが、多次元の場合はnumpyというライブラリを使うのが一般的なので、ここでは説明は省略させていただきます。
minの使い方について
min
はリストの最小の値の要素を取得します。
min の記述のルール
- min(リスト変数)
In[]
1 2 | list_num = [0, 4, 1, 3, 2] print(min(list_num)) |
Out[]
1 |
リストの追加、削除、更新の方法について
リストの特徴であるミュータブル(可変)の機能の解説をしていきます。
リストの特徴
- 追加:append, extend, insert
- 削除:clear, pop, remove, del
- 更新
では各々について見ていきましょう。
追加:append, extend, insert の使い方について
リストにデータを追加する以下の方法は3つあります。以下の list_a
, list_b
で確認していきましょう。
In[]
1 2 | list_a = [1, 2, 3, 4] list_b = [5, 6] |
追加には以下3つのメソッドがあります。
追加の3つのメソッド
- append
- extend
- insert
appendの使い方
appendはリストの末尾に追加します。
appendの記述のルール
- リスト変数.append(追加対象)
下記コードで確認してみましょう。
In[]
1 2 3 4 | list_a = [1, 2, 3, 4] list_b = [5, 6] list_a.append(list_b) print(list_a) |
Out[]
1 | [1, 2, 3, 4, [5, 6]] |
また、append メソッドについては以下にまとめていますので、参考にどうぞ。
【Python】appendの使い方のまとめ【基本から応用まで】
続きを見る
extendの使い方
先ほどの append では list_b
が末尾にそのまま入ってしまい、 [1, 2, 3, 4, [5, 6]]
となりましたが、[1, 2, 3, 4, 5, 6]
としたい場合には、extend
を使って、リスト同士を結合します。
extendの記述ルール
- リスト変数.extend(追加対象)
In[]
1 2 3 4 | list_a = [1, 2, 3, 4] list_b = [5, 6] list_a.extend(list_b) print(list_a) |
Out[]
1 | [1, 2, 3, 4, 5, 6] |
extendはリスト同士の結合なので、下記のように数値を入れるとエラーになるので注意してください。
In[]
1 2 | list_a = [1, 2, 3, 4] list_a.extend(5) |
Out[]
1 2 3 4 5 6 7 8 | --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-23-4a5e750a0cb6> in <module> 1 list_a = [1, 2, 3, 4] ----> 2 list_a.extend(5) 3 print(list_a) TypeError: 'int' object is not iterable |
Errorを確認すると int型 はダメと言われていますね。
insert の使い方
appendは末尾に追加していくメソッドでしたが、insertを追加する要素Noを指定することができます。
insertの記述のルール
- リスト変数.insert(要素No, 追加対象)
list_b
を list_a
の要素No1に追加してみましょう。
In[]
1 2 3 4 | list_a = [1, 2, 3, 4] list_b = [5, 6] list_a.insert(1, list_b) print(list_a) |
Out[]
1 | [1, [5, 6], 2, 3, 4] |
削除:clear, pop, remove, delの使い方について
次にリストの中身を削除していく方法についてみていきます。
削除の4つのメソッドの使い方について
- clear
- pop
- remove
- del
clear の使い方
リストの変数の中身を全部削除します。
clear の記述のルール
- リスト変数.clear()
In[]
1 2 3 4 | list_num = [1, 2, 3, 4] print(list_num)#削除前 list_num.clear() print(list_num)#削除後 |
Out[]
1 2 | [1, 2, 3, 4] [] |
popの使い方
pop の末尾から順番に要素を取り出し、削除や指定した要素Noを取り出しつつ、削除をすることができます
ここで、最初のリストの定義である、「順番を持った…」に意味が出てきます。
末尾から取り出せるのは、リストが順番を持っているからになります。
pop の使い方について
- 変数 = リスト変数.pop()
- 変数 = リスト変数.pop(要素No)
In[]
1 2 3 4 5 | list_num = [1, 2, 3, 4] print(list_num.pop()) # 末尾を取り出す print(list_num) print(list_num.pop()) # 末尾 print(list_num) |
Out[]
1 2 3 4 | 4 [1, 2, 3] 3 [1, 2] |
要素Noを指定して取り出す。
In[]
1 2 3 4 | list_num = [1, 2, 3, 4] a = list_num.pop(1) print(a) #取り出した要素 print(list_num) |
Out[]
1 2 | 2 [1, 3, 4] |
良くある質問
- Q:
pop
メソッドは実業務の処理として、どのように使われることがありますか?
単純にリストから削除するのであれば、remove や del でも良いのでは? popはどういった場面で活用できますか? - A:実際に現場でpopメソッドをあまり見ることはありません。
一般的な用途でいえば、以下の記事の課題ではこの様な使い方を行います。
この課題の例でいえば、患者の予約が入ると、どんどんリストに患者がたまっていきますね。関連記事【Python】オブジェクト指向の練習問題【診療支援アプリ作成】
続きを見る
予約順に診察の処理したいときに pop を使って、溜まった患者さんの診察を行いますが、その際には以下の方法を使用します。・予約が入る、患者リストの先頭に患者オブジェクトを追加
・診察するとき、患者リストからpopで取得した患者オブジェクトの人を診察この2つを繰り返すなどの方法で pop メソッドを使用します。
remove
指定した要素を削除します。要素Noではない点はご注意ください。
ココがポイント
- リスト変数.remove(要素)
下記例では、list_numの「1」を削除しています。
In[]
1 2 3 4 | list_num = [1, 2, 3, 4] print(list_num) #削除前 list_num.remove(1) print(list_num) #削除後 |
Out[]
1 2 | [1, 2, 3, 4] [2, 3, 4] |
数字だと要素Noと混乱するので、ここは、文字列の方がわかりやすいと思いますので、文字列でも確認しておきましょう。
先ほどは1を指定して削除しましたが、下記では ’ cat
’ を指定して削除します。
In[]
1 2 3 4 | list_animal = ['dog', 'cat', 'hippo', 'monkey'] print(list_animal) # 削除前 list_animal.remove('cat') print(list_animal) # 削除後 |
Out[]
1 2 | ['dog', 'cat', 'hippo', 'monkey'] ['dog', 'hippo', 'monkey'] |
del の使い方について
del
では、要素Noやスライスで指定した要素を削除します。
del の記述のルール
- del リスト変数[要素No]
- del リスト変数[要素No:要素No]
- del リスト変数[要素No:要素No:増分]
[1, 2, 3, 4]を削除して、動作を確認してみましょう。
In[]
1 2 3 4 | list_num = [1, 2, 3, 4] print(list_num) #削除前 del list_num[1] print(list_num) #削除後 |
Out[]
1 2 | [1, 2, 3, 4] [1, 3, 4] |
In[]
1 2 3 4 | list_num = [1, 2, 3, 4] print(list_num) #削除前 del list_num[1:3] print(list_num) #削除後 |
Out[]
1 2 | [1, 2, 3, 4] [1, 4] |
更新の使い方について
更新は値を取得するときの様に、要素Noを指定して、値を代入します。
更新の記述の仕方
- リスト変数[要素No] = 値
- リスト変数[要素No:要素No] = 値
- リスト変数[要素No:要素No:増分] = 値
[0, 0, 0, 0, 0]
の値を更新して、動作を確認してみましょう。
要素Noを指定して代入
In[]
1 2 3 | list_num = [0, 0, 0, 0, 0] list_num[1] = 1 print(list_num) |
Out[]
1 | [0, 1, 0, 0, 0] |
スライスで範囲を指定して代入。代入する値は、範囲指定分のリストである必要があります。
In[]
1 2 3 | list_num = [0, 0, 0, 0, 0] list_num[1:3] = [1, 2] print(list_num) |
Out[]
1 | [0, 1, 2, 0, 0] |
スライスで範囲、増分を指定して代入。
In[]
1 2 3 | list_num = [0, 0, 0, 0, 0] list_num[1:5:2] = [1, 2] print(list_num) |
Out[]
1 | [0, 1, 0, 2, 0] |
リストの繰り返し処理
list
は for
文を使うことで、一つずつ値を取得することができます。
リストの記述のルール
- for 値 in リスト変数:
下記のコード例で確認してみましょう。
In[]
1 2 3 | list_num = [1, 2, 3, 4, 5] for num in list_num: print(num) |
Out[]
1 2 3 4 5 | 1 2 3 4 5 |
文字列も同様に順番に取得が可能です。
In[]
1 2 3 | list_animal = ['dog', 'cat', 'hippo', 'monkey'] for animal in list_animal: print(animal) |
Out[]
1 2 3 4 | dog cat hippo monkey |
課題|リストの使い方の前編の課題
0~99までのリストを作成して、奇数の数値のみの足し算、偶数の数値のみの足し算、すべての数値の足し算を行いましょう。
課題の仕様
- 変数名
list_hundred
で0~99の数値のリストを作成してください。 list_hundred
からスライスを使って偶数のみをprint関数で表示してください。list_hundred
からスライスを使って奇数のみをprint関数で表示してください。- for文で
list_hundred
の偶数のみを変数名sum1
に足してください。 - for文で
list_hundred
の奇数のみを変数名sum2
に足してください。 - 100回繰り返すfor文で list_hundred を
pop()
を使って、値を取り出しつつ、sum_all
に足してください。 list_hundred
をprint
で表示して中身を確認してください。
演習方法1
課題と仕様を見て、自身でコーディングしてみてください。
コーディングに不安な方は、演習方法2のコードの穴埋めにて演習を実施してください。
演習方法2
— コード追加 — に1行ずつコードを埋めていって、プログラムを完成させてください。
演習のJupyter notebookをご利用される方は演習(google driveリンク)を参照いただければと思います。
●変数名list_hundredで0~99の数値のリストを作成してください。
その①:変数名list_hundredで0~99の数値のリストを作成してください。
In[]
1 2 | list_hundred = list(--- コード追加 ---) print(list_hundred) |
その②:list_hundred
からスライスを使って偶数のみを print関数 で表示してください。
In[]
1 | print(--- コード追加 ---) |
その③:list_hundred からスライスを使って奇数のみを print関数 で表示してください。
In[]
1 | print(--- コード追加 ---) |
その④:for文で list_hundred の偶数のみを変数名 sum1 に足してください。
In[]
1 2 3 4 | sum1 = 0 for i in --- コード追加 ---: sum1 += i print(sum1) |
その⑤:for文で list_hundred の奇数のみを変数名 sum2 に足してください。
In[]
1 2 3 4 | sum2 = 0 for i in --- コード追加 ---: sum2 += i print(sum2) |
その⑥:100回繰り返すfor文で list_hundred を pop() を使って、値を取り出しつつ、sum_all に足してください。
In[]
1 2 3 4 | sum_all = 0 for i in range(--- コード追加 ---): --- コード追加 --- print(sum_all) |
その⑦:list_hundred を print で表示して中身を確認してください。
In[]
1 | --- コード追加 --- |
解答例
解答例(google driveリンク)を参照いただければと思います。
その①:変数名 list_hundred で0~99の数値のリストを作成してください。
In[]
1 2 | list_hundred = list(range(100)) print(list_hundred) |
その②:list_hundred からスライスを使って偶数のみをprint関数で表示してください。
In[]
1 | print(list_hundred[0:100:2]) |
その③:list_hundred からスライスを使って奇数のみをprint関数で表示してください。
In[]
1 | print(list_hundred[1:100:2]) |
その④:for文で list_hundred の偶数のみを変数名 sum1 に足してください。
In[]
1 2 3 4 | sum1 = 0 for i in list_hundred[0:100:2]: sum1 += i print(sum1) |
その⑤:for文で list_hundred の奇数のみを変数名 sum2 に足してください。
In[]
1 2 3 4 | sum2 = 0 for i in list_hundred[1:100:2]: sum2 += i print(sum2) |
その⑥:100回繰り返すfor文で list_hundred を pop() を使って、値を取り出しつつ、sum_all に足してください。
In[]
1 2 3 4 | sum_all = 0 for i in range(len(list_hundred)): sum_all += list_hundred.pop() print(sum_all) |
その⑤:list_hundred を print で表示して中身を確認してください。
In[]
1 | print(list_hundred) |
リストは頻出する方法ですので、是非ここでマスターする様にしましょう。
今回は以上となります。お疲れ様でした。