前回の参照・更新・追加・削除編では、リストを初期化した後の要素へのアクセスや更新・追加・削除方法についてお話ししました。
次はリストについて、ここまでに登場しなかったメソッドや連結などのいくつかの使い方を見ていきましょう。
目次
リストの連結
まずはリストの連結方法から見ていきましょう。
連結とは2つ以上のリストを繋げることです。
「+」を使って連結する
連結自体は非常に簡単で、「+」演算子でリスト同士を繋げるだけです。
list_1 = [1, 2, 3]
list_2 = ["a", "b", "c"]
connected_list = list_1 + list_2
print(connected_list)
結果 [1, 2, 3, 'a', 'b', 'c']
ちなみにここでも代入演算子の「+=」が使えます。
list = [1, 2, 3]
list += ["a", "b", "c"]
print(list) #結果は同じ
extend()を使って連結する
extend()メソッドを使えば、代入演算子と同じようにリストを連結できます。
特段違いはないので、使いやすい方で問題ありません。
list = [1, 2, 3]
list.extend(["a", "b", "c"])
print(list)
リストをスライスする
次にリストをスライスする方法を見ていきましょう。
スライスとはリストの中から一部分だけを取り出すことです。
リストのスライス方法は主に2つあります。一つは指定した範囲の要素を取り出すスタンダードなスライス。もう一つは要素を等間隔に抜き出すスライスです。
指定した範囲の要素を取り出す
まずはシンプルなスライスから見ていきましょう。
指定範囲のスライスは開始位置と終了位置を書式に合わせて指定するだけです。
書式 リスト[開始位置 : 終了位置]
開始位置も終了位置も省略が可能です。両方とも省略すると[:]だけが残りますが、これは「全ての要素」を意味し、[開始位置 : ]なら開始位置から最後の要素まで、[ : 終了位置]なら最初の要素から終了位置までの要素を抜き出します。
一つ注意があります。それは「開始位置はインデックス番号だが、終了位置はインデックス番号 + 1」という点です。これは実際にスライスしてみたほうが早いでしょう。
list = ["1.林檎", "2.蜜柑", "3.葡萄", "4.甘蕉", "5.西瓜", "6.甜瓜"]
print(list[:]) #全て抜き出す(リストの複製に便利)
print(list[2:]) #3番目の要素から最後まで
print(list[:3]) #最初から3番目の要素まで
print(list[1:4]) #2番目から4番目の要素まで
結果 ['1.林檎', '2.蜜柑', '3.葡萄', '4.甘蕉', '5.西瓜', '6.甜瓜'] ['3.葡萄', '4.甘蕉', '5.西瓜', '6.甜瓜'] ['1.林檎', '2.蜜柑', '3.葡萄'] ['2.蜜柑', '3.葡萄', '4.甘蕉']
それぞれのスライス結果が表示されました。
3〜4行目は終了位置をそれぞれ3と4で指定していますが、実際にスライスされたリストは「インデックス番号 + 1」分まで抜き出されていますね。
バグを引き起こしがちなところなので、注意しましょう。
マイナスを指定してスライスする
次のスライス方法に行くまえに、マイナスを指定してスライスしたらどうなるかを見ていきましょう。
開始位置と終了位置にマイナスを指定すると、リストの後ろの方から抜き出すことができます。
例えば最後の要素は[-1:]、最後の3つの要素は[-3:]で抜き出せます。
実際にやってみましょう。
list = ["1.林檎", "2.蜜柑", "3.葡萄", "4.甘蕉", "5.西瓜", "6.甜瓜"]
print(list[-1:]) #最後の要素
print(list[-3:]) #最後の3つの要素
print(list[:-2]) #最後から2つ以外の要素
print(list[-4:-1]) #最後から4つめの要素から最後から2つ目の要素まで
結果 ['6.甜瓜'] ['4.甘蕉', '5.西瓜', '6.甜瓜'] ['1.林檎', '2.蜜柑', '3.葡萄', '4.甘蕉'] ['3.葡萄', '4.甘蕉', '5.西瓜']
マイナス値でのスライスは間違えやすいので注意して使いましょう。
要素を等間隔で抜き出す
次に要素を等間隔で抜き出すスライス方法を見ていきましょう。
等間隔で抜き出す場合は通常のスライスの終了位置の後に「ステップ数」を追記します。
書式 リスト[開始位置 : 終了位置 : ステップ数]
では実際に等間隔で要素を抜き出してみましょう。
ステップ数だけ指定したい場合は[::ステップ数]という形になります。
list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
print(list[::2]) #奇数
print(list[1::2]) #偶数
print(list[2::3]) #3の倍数
print(list[2:10:2])
結果 [1, 3, 5, 7, 9, 11] [2, 4, 6, 8, 10, 12] [3, 6, 9, 12] [3, 5, 7, 9]
ちなみに、ステップ数をマイナスにすると「リストを反転させる」ことができます。
list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
print(list[::-1])
print(list[::-2])
結果 [12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1] [12, 10, 8, 6, 4, 2]
リスト同士の比較
今度はリスト同士の比較方法を見ていきましょう。
リスト同士の比較は、ただ同じ要素が入った別のリストなのか、同じリストを参照している変数なのかで比較結果が変わってきます。
==での比較
まずは==で比較してみましょう。
==は「同じ要素のリスト」の場合True、そうでない場合はFalseを返します。
実際にやってみましょう。
list_1 = ["abc", "def", "ghi"]
list_2 = ["abc", "def", "ghi"]
list_3 = ["abc", "ghi", "def"]
print(list_1 == list_2)
print(list_1 == list_3)
結果 True False
list_1とlist_2は完全に同じ要素なのでTrue、list_1とlist_3は要素の並びが違うのでFalseになります。
isでの比較
リストが同じ要素を参照しているかを判定するにはis, is not演算子を使います。
list_1 = ["abc", "def", "ghi"]
list_2 = list_1
list_3 = ["abc", "def", "ghi"]
print(list_1 is list_2) #同じリスト(オブジェクト)
print(list_1 is list_3) #同じ要素だけど別のリスト
print(list_1 is not list_3)
結果 True False True
list_2にはlist_1のリストの参照を渡しているので、list_1とlist_2は同じオブジェクトとして扱われます(なので結果はTrue)。
一方でlist_1とlist_3は同じ要素なので「==」ではTrueになりますが、リストとしては別物です(別のオブジェクト)。
リストの要素を並び替える
最後にリストの要素の並び替え方法について見ていきましょう。
sort()を使って並び替える
リストをソートするにはsort()メソッドを使います。
特に引数を指定しない場合、sort()は数値の場合は小さい順、文字列の場合はアルファベット順、日本語の場合はあいうえお順になります。
list_num = [25, 21, 88, -39, 9, 4, -54, 0, 77]
list_num.sort()
print(list_num)
list_eng = ["apple", "banana", "orange", "cherry", "melon"]
list_eng.sort()
print(list_eng)
list_jpn = ["りんご", "ばなな", "みかん", "さくらんぼ", "めろん"]
list_jpn.sort()
print(list_jpn)
結果 [-54, -39, 0, 4, 9, 21, 25, 77, 88] ['apple', 'banana', 'cherry', 'melon', 'orange'] ['さくらんぼ', 'ばなな', 'みかん', 'めろん', 'りんご']
また、リストを降順に並べたい場合はreverse引数にTrueを指定します。
list_num = [25, 21, 88, -39, 9, 4, -54, 0, 77]
list_num.sort(reverse = True)
print(list_num)
結果 [88, 77, 25, 21, 9, 4, 0, -39, -54]
lenを使って文字列の長さでソートする
sort()のkey引数にlenを指定することで、文字列の長さでソートすることができます。
list = ["book", "pen", "basketball", "lemon", "student", "homework", "sports"]
list.sort(key = len)
print(list)
結果 ['pen', 'book', 'lemon', 'sports', 'student', 'homework', 'basketball']
sorted()を使って新しいリストを作る
sorted()を使うと、元のリストはそのままに、ソートされた新しいリストを作成することができます。
sorted()はsort()と違い組み込み関数なので、書き方が違うことに注意が必要です。
list = ["book", "pen", "basketball", "lemon", "student", "homework", "sports"]
list_sorted = sorted(list, reverse = True, key = len) #reverseやkeyも指定できる
print(list)
print(list_sorted)
結果 ['book', 'pen', 'basketball', 'lemon', 'student', 'homework', 'sports'] ['basketball', 'homework', 'student', 'sports', 'lemon', 'book', 'pen']