この記事ではPythonのリスト(list)について解説します。
リストの入門編として「リストとは何か」と、「リストの基本的な操作方法」について説明していきます。
リスト(list)とは
リストはPythonのデータ型の一つで、配列と呼ばれ、[]
を使用します。[]
の中に格納した値を「要素」と呼び、それぞれに「インデックス」と呼ばれる番号を付与します。インデックスは、先頭が0から始まる点に注意しましょう。
Pythonでは、以下のように宣言します。
sample_list = ["A", "B", "C", "D", "E"]
この時、要素とインデックスの関係は以下のようになります。
index | 0 | 1 | 2 | 3 | 4 or -1 |
---|---|---|---|---|---|
要素 | a | b | c | d | e |
リストの宣言と初期化
リストは、「空の配列の宣言」と「配列の初期化」の2つにより作成できます。
# listの宣言と空のlistを作成
sample_list = []
# listの宣言と要素を追加
sample_list = ["A", "B", "C", "D", "E"]
listの操作について
Pythonでは、list型の変数に対して、様々なメソッドを用意しています。基本的なメソッドについて表にまとめました。
操作メソッド | 詳細 |
---|---|
append() | リストの末尾に要素を一つ追加する |
insert() | 指定した位置に要素を挿入する |
clear() | リストの中の要素を全て削除する |
remove() | 要素を指定し、その要素を削除する |
pop() | インデックス指定に対応した要素を削除する |
index() | 要素指定に対応したインデックスを検索する |
len() | リストの中の要素を数える |
extend() | 複数のリスト一つに結合する |
sort() | リストの中の要素を整列させる |
また、上記の基本的なメソッド以外に今回紹介する演算子なども表にまとめました。
演算子など | 詳細 |
---|---|
+ | 複数のリストを一つに結合する演算子 |
in | 要素があるかを検索する演算子 |
del | リストの中の要素を削除するdel文 |
join() | 文字列を結合するstr型のメソッド |
sorted() | リストの中の要素を整列させる組み込み関数 |
リストの基本操作
ここから、上で紹介したメソッドなどを実際にコーディングして、その動作を確認していきます。
要素の取得
- インデックス指定
リストに対してインデックスを指定すると、指定したインデックスに対応した要素を取得することができます。
sample_list = ["A", "B", "C", "D", "E"]
# ①index0を指定
print(sample_list[0])
# 出力結果: A
# ②どちらもリストの末尾を指定している
print(sample_list[4])
print(sample_list[-1])
# 出力結果: E
# ③存在しないindexを指定
print(sample_list[6])
# 出力結果: IndexError: list index out of range
③のように、存在しないインデックスを指定するとエラーになります。詳しくは下の図を参考にしてください。
- スライス
スライスは、:
(コロン)の前後にインデックスを指定することで行います。リストに対してスライスを行うと、スライスで指定した範囲の要素の入った配列が取得できます。
sample_list = ["A", "B", "C", "D", "E"]
# ①index0~4の1個前まで
print(sample_list[0:4])
# 出力結果: ['A', 'B', 'C', 'D']
# ②index-1~全て
print(sample_list[-1:])
# 出力結果: ['E']
# ③index2~6の1個前まで
print(sample_list[2:6])
# 出力結果: ['C', 'D', 'E']
# ④index5~全て
print(sample_list[5:])
# 出力結果: []
①の、インデックスを:
より後に指定した時の範囲は指定したインデックスの1個前までとなる、という点に注意してください。
②のように、スライスの際のインデックスをどちらか省略することができます。
また、③と④のように存在しないインデックスを指定してスライスを行うと、エラーにはなりませんがその際の動作が特殊です。詳しくは下の図を参考にしてください。
要素の追加
- append()
append()
は末尾に要素を追加します。
sample_list = ["A", "B", "C"]
# ①
sample_list.append("D")
print(sample_list)
# 出力結果: ['A', 'B', 'C', 'D']
# ②
sample_list.append(["E", "F"])
print(sample_list)
# 出力結果: ['A', 'B', 'C', 'D', ['E', 'F']]
# ③
sample_list.append("100")
print(sample_list)
# 出力結果: ['A', 'B', 'C', 'D', ['E', 'F'], '100']
②では配列を追加しました。append()
では配列も一つの要素とみなされ、配列同士が結合されることはありません。
③ではint型の100
を追加しました。リストは異なるデータ型の要素を格納できます。
- insert()
insert()
は指定した位置に要素を挿入します。第1引数にインデックス、第2引数に要素を指定します。
sample_list = ["A", "B", "C"]
# ①index1を指定してい"X"を挿入
sample_list.insert(1, "X")
print(sample_list)
# 出力結果: ['A', 'X', 'B', 'C']
# ②リストの末を指定して"Y"を挿入
sample_list.insert(-1, "Y")
print(sample_list)
# 出力結果: ['A', 'X', 'B', 'Y', 'C']
# ③存在しないindexを指定して、"Z"を挿入
sample_list.insert(5, "Z")
print(sample_list)
# 出力結果: ['A', 'X', 'B', 'Y', 'C', 'Z']
①と②の実行結果を見てください。insert()
で指定したインデックスより後の要素は後ろにずれる形になります。
③のように存在しないインデックスを指定した場合、元々あったリストの要素の末尾に追加されます。
要素の削除
- clear()
clear()
を使用するとリストの中の要素を全て削除します。メソッドの実行後は空の配列が残ります。
sample_list = ["A", "B", "C", "D", "E"]
sample_list.clear()
print(sample_list)
# 出力結果: []
- remove()
remove()
は要素を指定し、その要素を削除します。
sample_list = ["A", "B", "B", "D", "E"]
# ①
sample_list.remove("A")
print(sample_list)
# 出力結果: ['B', 'C', 'D', 'E']
# ②
sample_list.remove("B")
print(sample_list)
# 出力結果: ['B', 'D', 'E']
# ③存在しない要素を指定する
sample_list.remove("Z")
print(sample_list)
# 出力結果: ValueError: list.remove(x): x not in list
②では要素が二つあるB
を指定しましたが、出力結果にまだB
が存在しています。remove()
は最初にマッチした要素だけ削除します。
③のように存在しない要素を指定するとエラーになります。
- pop()
pop()
はインデックスを指定し、指定したインデックスに対応した要素を削除します。引数を省略した場合はリストの末尾を削除します。
sample_list = ["A", "B", "C", "D", "E"]
# ①index0を指定
print(sample_list.pop(0))
print(sample_list)
# 出力結果:
# A
# ['B', 'C', 'D', 'E']
# ②引数を省略
sample_list.pop()
print(sample_list)
# 出力結果: ['B', 'C', 'D']
# ③存在しないindexを指定
sample_list.pop(4)
# 出力結果: IndexError: pop index out of range
①の最初のprint()
では、pop()
を使用した際にA
と出力されました。pop()
には削除する際にその要素を返すという特徴があります。
②の実行結果を見ると、リストの末尾にあったE
が削除されています。つまり、pop()
の引数を省略するとリストの末尾を削除します。
③のように存在しないインデックスを指定するとエラーになります。
- del
del
はdel文と呼ばれ、インデックスを指定して要素を削除することができます。インデックス指定はpop()
でも出来ますが、del
は実行時に削除した要素を返しません。また、スライスで複数の要素を削除することや、リスト自体を削除することもできます。
sample_list = ["A", "B", "C", "D", "E"]
# ①index0を指定
del sample_list[0]
print(sample_list)
# 出力結果: ['B', 'C', 'D', 'E']
# ②index1~-1の1個前まで
del sample_list[1:-1]
print(sample_list)
# 出力結果: ['B', 'E']
# ③リスト自体を削除
del sample_list
print(sample_list)
# 出力結果: NameError: name 'sample_list' is not defined
②ではスライスで指定した範囲の複数の要素を削除しました。
③では、sample_list
自体を削除しました。そのため、リストを出力しようとしても「そのリストがない」というエラーが出ます。
検索方法
- in
in
はリストの中に指定した要素があるかを検索する演算子です。検索後の結果はTrue
またはFalse
で返されます。
sample_list = ["A", "B", "C", "D", "E"]
# ①要素Aを検索
print("A" in sample_list)
# 出力結果: True
# ②存在しない要素Xを検索
print("X" in sample_list)
# 出力結果: False
①は指定した要素が存在するため、Trueと返されます。
②では存在しない要素を指定したため、Falseとなります。
- index()
index()
は要素を指定し、その要素があるかを検索します。返されるのはその要素のインデックスです。
sample_list = ["A", "B", "C", "D", "E"]
# ①要素Eを指定
print(sample_list.index("E"))
# 出力結果: 4
# ②存在しない要素Xを指定
print(sample_list.index("X"))
# 出力結果: ValueError: 'X' is not in list
①は指定した要素に対応したインデックスが返されます。
②では存在しない要素を指定したため、エラーとなります。
カウント
- len()
len()
は引数にリストを指定するとリストの中の要素数を数えることができます。リストの中の要素が何であるかは関係なく、例えば「リスト内の配列」は一つの要素と数えられます。
sample_list1 = ["A", "B", "C", "D", "E"]
sample_list2 = [100, 2000, True, ["X", "Y"]]
# ①
print(len(sample_list1))
# 出力結果: 5
# ②
print(len(sample_list2))
# 出力結果: 4
リストの応用操作
ここからリストの応用操作に移ります。リストの基本操作ではリストの中のインデックスや要素に対して操作しましたが、応用操作ではリスト自体を操作していきます。
結合
- extend()
extend()
はリストに文字列を結合、またはリスト同士の結合を行うことができます。
sample_list1 = ["A", "B"]
sample_list2 = ["E", "F"]
# ①
sample_list1.extend("CD")
print(sample_list1)
# 出力結果: ['A', 'B', 'C', 'D']
# ②
sample_list1.extend(sample_list2)
print(sample_list1)
# 出力結果: ['A', 'B', 'C', 'D', 'E', 'F']
# ③
sample_list3 = sample_list1.extend(sample_list2)
print(sample_list3)
# 出力結果: None
①ではリストに文字列を結合しました。出力結果を見て分かるように、CD
の要素が一つずつ格納されました。
②ではリスト同士の結合を行いました。結合元のsample_list1
に対してextend()
を使用することで、sample_list1
の末尾にsample_list2
の要素が結合されました。
③ではリスト同士の結合結果を、新しいリスト変数sample_list3
に格納しました。sample_list3
の中身を見るとNone
となっています。extend()
では結合結果を他のリスト変数に格納することができません。
+
は結合を行う演算子です。結合を行える範囲がextend()
とは異なりますので以下を見てください。
sample_list1 = ["A", "B"]
sample_list2 = ["E", "F"]
# ①
sample_list1 + "CD"
print(sample_list1)
# 実行結果: TypeError: can only concatenate list (not "str") to list
# ②
sample_list1 + sample_list2
print(sample_list1)
print(sample_list2)
# 出力結果: ['A', 'B']
# 出力結果: ['E', 'F']
# ③
sample_list3 = sample_list1 + sample_list2
print(sample_list3)
# 出力結果: ['A', 'B', 'E', 'F']
①ではリストに文字列を結合しようとしましたが、エラーになりました。(上記のコードを試す際は①の処理をコメントアウトしてください)
②ではリスト同士を結合しましたが、それぞれのリストに変化はありません。リスト同士の結合を行うためには、③のように新しいリスト変数に格納する必要があります。
- join()
join()
はリストの文字列の要素を連結することができます。
"".join(sample_list)
のように空の文字列を指定すると、abcde
と要素が返されます。空の文字列ではなく、,
(カンマ)区切りで返したい場合は","
と指定するとa,b,c,d,e
と返されます。
例えば、sample_list = ["a", "b", "c", 4, 5]
のように文字列以外の要素が入っている場合にjoin
を使用するとエラーになります。sample_list
を["a", "b", "c", "4", "5"]
のように全て文字列にしてからjoin
を使用すると結合できます。
分割
- スライス
前述したスライスを使用すると、リストの要素を分割することができます。
sample_list = ["A", "B", "C", "D", "E"]
# ①index2~全て
print(sample_list[2:])
print(sample_list)
# 出力結果:
# ['C', 'D', 'E']
# ['A', 'B', 'C', 'D', 'E']
# ②index2~全て
new_sample_list = sample_list[2:]
print(new_sample_list)
# 出力結果: ['C', 'D', 'E']
①を見て分かると思いますが、スライスで分割した後に分割元のsample_list
の中身が変わるわけではありません。分割した結果を次の処理に使いたい場合は、②のように分割した結果を新しいリスト変数に格納する必要があります。
整列
sort()
とsorted()
を使用するとリスト内の要素を昇順、または降順で並び替えることができます。まずは双方の基本的な動作を確認してみましょう。
- sort()
sample_list = ["E", "D", "C", "B", "A"]
# ①昇順に整列
sample_list.sort()
print(sample_list)
# 出力結果: ['A', 'B', 'C', 'D', 'E']
# ②降順に整列
sample_list.sort(reverse=True)
print(sample_list)
# 出力結果: ['E', 'D', 'C', 'B', 'A']
# ③昇順に整列した結果を新しいリスト変数に格納する
new_sample_list = sample_list.sort()
print(new_sample_list)
# 出力結果: []
- sorted()
sample_list = ["E", "D", "C", "B", "A"]
# ①昇順に整列
sorted(sample_list)
print(sample_list)
# 出力結果: ['A', 'B', 'C', 'D', 'E']
# ②降順に整列
sorted(sample_list, reverse=True)
print(sample_list)
# 出力結果: ['E', 'D', 'C', 'B', 'A']
# ③昇順に整列した結果を新しいリスト変数に格納する
new_sample_list = sorted(sample_list)
print(new_sample_list)
# 出力結果: ['A', 'B', 'C', 'D', 'E']
sort()
はリストに対してsort()
を実行すると、リスト内の要素が昇順に整列します。降順は引数にreverse=True
を指定することで行います。
sorted()
は関数なので、引数に整列対象のリストを渡します。そのまま実行するとリスト内の要素が昇順に整列します。降順は第2引数にreverse=True
を指定することで行います。
上で動作確認をしたsort()
とsorted()
それぞれの③の実行結果が異なっています。これは、sort()
の処理がリストを一度変更する破壊的処理であり、sorted()
の処理がリストを変更しない非破壊処理であるためです。詳しくは下の図を参考にしてください。
まとめ
今回はリストとその操作について解説しました。
Pythonで扱われる値をまとめるデータ型の中でも特に多く使用されます。「条件分岐」や「繰り返し」などの発展的な用途に活かせるように、リスト操作の基本的な部分はしっかりと押さえておきましょう。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2023.04.16
IaCとは?IaCのメリットやデメリット、Terraformなどの構成管理ツールの特徴を紹介
IaC(Infrastructure as Code)とは、サーバーやネットワーク、ストレージなどをはじめとしたインフラの構成をコード化し、その構成や管理を自動化する手法のことです。
- プログラミング
- インフラエンジニア
2022.12.14
継続的インテグレーション・継続的デリバリー(CI/CD)とは
CI/CDは1つの技術を指すものでなく、ソフトウェアの変更を常にテストして自動で本番環境にリリース可能な状態にしておくソフトウェア開発の手法を意味します。
- プログラミング
2023.08.19
ノーコードのメリット・デメリットと代表的なノーコードツール
今回はノーコードについて、「メリット・デメリット」や「ノーコードを使って開発された事例」「代表的なノーコードツール」を紹介します。
- プログラミング