Pythonを勉強するために本を買ったけど,積読してる.
最初の方の数値や算術演算,文字列の扱いで止まっている.
リストの操作は似たようのものがたくさんあり,関数やメソッドがたくさん出てきてよく分からなくなった.
操作のまとめ表みたいなものがあるとわかりやすいのに.
そんな方が,リストを理解して,タプルや辞書の学習に進むための記事です.
本記事の内容
これまでの記事で,整数,浮動小数点数,複素数,文字列という個別のデータ型を学んできましたね.Pythonでは,このような個々のデータをひとまとめにして扱うことができる,複合データ型を備えています.本記事から数記事に渡り,複合データ型を解説していきます.今回は,「リスト」です.まずはリストの作成とデータ(個々の要素)の取得方法を,その後要素の変更方法などを解説します.これまでの記事と同様に,コードを打ちながら学んで行きましょう.余力のある方は,部分的にコードを変更して実験してみましょう.
Pythonの文法基礎から実務的な分析・機械学習まで学べるオンライン学習サービス(1週間無料です)
リストとは|作成方法
複合データ型を,表1にまとめます.その1つがリストです.リストは,複数のデータに順番をつけて,ひとまとめにしたデータです.リストは、その要素を追加したり、置き換えたり、変更可能(ミュータブル)なデータ型です.
表1.複合データ型
型(クラス) | ミュータブル※1 | シーケンス型※2 |
---|---|---|
リスト(list) | ○ | ○ |
タプル(tuple) | × | ○ |
辞書(dict) | ○ | × |
集合(set) | ○ | × |
※1: ミュータブル:同じオブジェクトで中の値を書き換え可能.
※2: シーケンス型:順序を持つ.
リストを使う場面としては,データ解析です.まずは,リストの作成方法を学びながら,実行結果がどのように表示されるかをみてみましょう.同時に,入力ルールの理解を深めましょう.
リストの作成
0個以上の要素(リスト内のオブジェクト)をカンマで区切り,[ ](角括弧)で囲んで記述します.いくらでも要素を増やすことができ,長いデータになることもあります.そのような場合,変数に代入することによって,短いコードで表現できます.
1つ目の例以外は,変数に代入した形で示します.数字や調味料のデータがあると考えてください.
0個以上の要素をカンマで区切り,角括弧で囲んで記述する.
[-3, -2, 1, 0, 1, 2, 3]
["さとう", "しお", "す", "せうゆ", "みそ"]
["砂糖", "塩", "酢", "醤油", "味噌"]
変数に代入できる.
list_ex1 = [-3, -2, 1, 0, 1, 2, 3] list_ex1
list_ex2 = ["砂糖", "塩", "酢", "醤油", "味噌"] list_ex2
異なる型が混在しても良い.
list_ex3 = [3, "砂糖", "塩", "酢", "醤油", "味噌", 6.02e23] list_ex3
同じ要素を含んでも良い.
list_ex4 = [3, "砂糖", "塩", "酢", "醤油", "味噌", 6.02e23, 3, "塩"] list_ex4
リストを入れ子できる.
list_ex5 = [3, ["砂糖", "酒", "みりん"], "塩", "酢", "醤油", "味噌", 6.02e+23] list_ex5
変数をリストに入れることもできる.
list_ex6 = ["砂糖", "酒", "みりん"] list_ex7 = [3, list_ex6, "塩", "酢", "醤油", "味噌", 6.02e+23] list_ex7
何も記述しない場合,空リストとなる.
list_empty = [] list_empty
まとめ
- 0個以上の要素をカンマで区切り,角括弧で囲んで記述する.
- 変数に代入できる.
- 異なる型が混在しても良い.
- 同じ要素を含んでも良い.
- リストを入れ子できる.
- 変数をリストに入れることもできる.
- 何も記述しない場合,空リストとなる.
型の確認
type()関数を使って確認します.「list」と表示されるか確認してみましょう.前述のリストはすべてリストです.
type(list_ex3)
文字列から変換
文字列もシーケンスでした.従って,文字列を1文字ずつ分割して,リストに変換できます.
list("リストにするで!")
list("I'll be there ")
リストとインデックス—要素の取得
文字列と同様に,「インデックス」を用いて,要素を指定することができます.インデックスを指定するには,角カッコ(ブラケット)[ ] の中にオフセットを添えましたね.
list_ex2を例にすると,表のように,先頭の文字のオフセットを0,その次を1・・・または末尾の文字のオフセットを-1,その次を−2・・・として,指定することができます.
list_ex2の要素 | “砂糖” | “塩” | “酢” | “醤油” | “味噌” |
オフセット(先頭から) | 0 | 1 | 2 | 3 | 4 |
オフセット(末尾から) | -5 | -4 | -3 | -2 | -1 |
前述のように,リスト名を実行して全要素を取得する方法がありました.ここでは,インデックスを使用して要素の一部を取得するしてみましょう.
要素の抽出
文字列と同様に,リストから1つの要素をを取り出すには,リストの後ろに角カッコ(ブラケット)[ ]を付して,その中に取り出したい要素のオフセットを入力してインデックスします.
["砂糖", "塩", "酢", "醤油", "味噌"][1]
list_ex2[1]
list_ex2[-2]
リストのスライス
文字列のスライスと同様に,リスト内の要素の一部を取り出すには,その取り出し方によって,—インデックスを使った—いくつかの方法があります.角カッコに,開始するオフセット(開始値),停止するオフセット(停止値)などを指定する方法です.
停止値は,取り出したい文字列のオフセットに+1加えたオフセットを指定します.オフセットと要素の関係をわかりやすくするために,0~8の整数のリストをlist_numに代入して,練習してみましょう.
list_num = [0, 1, 2, 3, 4, 5, 6, 7, 8]
[:] → リスト内の全要素
list_num[:]
[開始値:] → 指定した開始値から末尾までの要素
list_num[5:]
list_num[-4:]
[:停止値] → 先頭([0])から指定した停止値の1つ手前までの要素
list_num[:7]
list_num[:-2]
[開始値:停止値] → 指定した開始値から停止値の1つ手前までの要素
list_num[5:9]
list_num[-4:9]
[開始値:停止値:間隔] → 指定した開始値から停止値の1つ手前まで,指定した間隔ごとの要素
list_num[0:6:2]
[::間隔] → 間隔のみを指定すると,0から順番に間隔ごとに出力
list_num[::-1] # 逆順になります.
リストの操作
表2.リストの操作一覧
操作 | 関数・メソッド | 演算子ほか | インデックス |
---|---|---|---|
連結 | .extend() | +, += | |
追加 | .append(), .insert() | * | |
置換 | ◯ | ||
削除 | .clear(), .pop(), remove() | del文 | |
並べ替え | sorted(), .sort(), .reverse() | ||
検索・取得 | .index(), count(), len() | in | ◯ |
リストの連結
.extend()メソッド → 末尾に別のリストを連結する.
prime1 = [2, 3, 5, 7, 11] prime2 = [13, 17, 19, 23] prime1.extend(prime2) # prime1の末尾に,prime2が連結する. prime1
+演算子
prime1 = [2, 3, 5, 7, 11] prime2 = [13, 17, 19, 23] prime1 + prime2 # prime1 + prime2を出力.
+=演算子
prime1 = [2, 3, 5, 7, 11] prime2 = [13, 17, 19, 23] prime1 += prime2 # 代入演算子を用いて,prime1 = prime1 + prime2とすることもできる. prime1 # prime1を出力
要素の追加
.append()メソッド → リストの末尾に要素を追加する.
prime1 = [2, 3, 5, 7, 11] prime1.append(13) prime1
prime1.append(11) # 11を追加したprime1にさらに13を追加 prime1 # prime1を出力.同じ値を複数追加できる.
prime1 = [2, 3, 5, 7, 11] prime2 = [13, 17, 19, 23] prime1.append(prime2) # prime1の末尾に,prime2が追加される.連結ではなく,リストが入れ子なる. prime1 # prime1を出力
.insert()メソッド → 追加したい位置を指定して追加する.
fibo1 = [0, 1, 1, 2, 3, 5, 8] fibo2 = "golden ratio" # リスト.insert(追加したい位置のオフセット, 追加したい要素) fibo1.insert(1, fibo2) # インデックス値が1,すなわち初めの0の次に入る. fibo1
*演算子
fibo1 *= 2 # 代入演算子を用いて,fibo1 = fibo1*2とすることもできる. fibo1
要素の置換
要素を他の値に置き換えることができます.インデックスを使い,次のように,置換したい位置を指定する方法です.
リスト[置換したい位置のオフセット]
seasoning = ["砂糖", "塩", "酢", "醤油", "味噌"] seasoning[0] = "sugar" seasoning
要素の削除
.clear()メソッド → 全ての要素を削除する.
unneed = ["hard working", "deadline", "tax"] unneed.clear() unneed
.pop()メソッド → オフセットを指定して削除する.
life = ["family", "health", "hobby", "money", "work"] life.pop(4) # オフセット4 すなわち"work"が指定される. life # "work"を取り出して削除したlifeを出力する.
life = ["family", "health", "hobby", "money", "work"] life.pop() # オフセットを指定しなければ,[-1],すなわち末尾の要素が指定される. life # "work"を取り出して削除したlifeを出力する.
.remove()メソッド → 要素の値を指定して削除する.
life = ["family", "health", "hobby", "money", "work"] life.remove("work") life
del文
life = ["family", "health", "hobby", "money", "work"] del life[4] life
要素の並べ替え
sorted()関数 → 元のリストを変更せず,ソートされた新しいリストを作成する.
mathematics1 = ["integral", "pi", "Euler's number", "imaginary unit"] sorted(mathematics1) # アルファベット順となる.
mathematics1 # 元のリストを出力すると,変更されないことを確認できる.
mathematics2 = ["integral", "π", "🥺", "pi", "円周率", "Euler's number", "オイラー", "imaginary unit"] sorted(mathematics2) # アルファベット,記号,五十音,絵文字の順となる.
Keyパラメータを指定して,絶対値順、文字列の長さ順,昇順降順など、様々な条件で並び替えることができます.
sorted(mathematics2, key = len, reverse = True) # lenで文字列の長さ順,reverse = Trueで降順にソート
.sort()メソッド → 元のリストをソートされたリストに書き換える.
mathematics1 = ["integral", "pi", "Euler's number", "imaginary unit"] mathematics1.sort() mathematics1 # 元のリストがソートされたリストに変更される.
要素が数値なら数値の昇順,文字列ならアルファベット・五十音順にソートされます,数値と文字列を混合するとエラーとなります.
要素の検索
.index()メソッド → 要素のオフセットを調べる.
fibo1 = [0, 1, 1, 2, 3, 5, 8] fibo1.index(8) # 8のオフセットが出力される.
fibo1.index(1) # 同じ要素があると最初の値のオフセットが出力される.
.count()メソッド → 要素の個数を調べる.
fibo1.count(8)
fibo1.count(1) # フィボナッチ数列なので,1が2つある.
len()関数 → リスト内の要素数を調べる.
len(fibo1)
in → 要素の有無を調べる.
Trueと返ってきたら,要素が有り,Falseと返ってきたら要素は無いという判定です.TrueとFalse(論理値)のことを詳しく説明していないので,ここでは有無(真偽)をこのように確認するんだなくらいの理解で結構です.
8 in fibo1
4 in fibo1
リストについて,基本を学べましたでしょうか?
次は「タプル」について学びましょう!
最後まで読んでくださり,ありがとうございます☺️