Python: リスト(配列) まとめ

Pythonでのリストの操作、リスト作成、取得、追加、削除などの 操作についてまとめています。

リストを作成する

Pythonでリストを作成する場合は、 []角括弧の中に値をカンマ区切りで記述します。

書式
リスト名 = [値1, 値2, 値3]

リストの作成例は次の通りです。

li = ["a", "b", "c"]

li2 = [10, 20, 30]

空のリストを作成する場合は[]だけを記述します。

# 空のリスト
li = []

リストの要素が多い場合の記述

Pythonでは基本的に1文を1行で記述します。
ですがリストなどのコレクションの場合は記述が長くなる場合があります。 その場合は次のように複数行で書くことができます。

li = ["aaaaa", "bbbbb", "ccccc", 
	"ddddd", "eeeee", "fffff", 
	"ggggg", "hhhhh", "iiiii"]

print(len(li))  # 9

リスト内容を表示

リストの値(内容)を表示する場合は、 print()関数を使います。

print()関数の引数にリスト名を指定すると、 リストの内容が横一列に表示されます。

li = ["a", "b", "c"]

print(li) 

# 実行結果
 ['a', 'b', 'c']

for文を使って表示する

リストの値が少ない場合は上記の表示方法でも問題ありません。
ですがリストの内容が多い場合は、 要素を一つずつ別の行で表示した方が見やすくなります。
その場合は、for文を使ってリストをループさせます。

li = ["aaaaa", "bbbbb", "ccccc"]

# for文を使って1つずつ表示
for d in li:
	print(d)

# 実行結果
aaaaa
bbbbb
ccccc

リストの内容が多い場合は、この方が見やすくなります。

要素数を取得 len()

リストの要素数を取得する場合は len()関数を使います。

書式
len(リスト)

戻り値はリストの要素数で、 リストが空の場合は「0」を戻します。

li = [0, 1, 2, 3, 4]

print(len(li))  # 5

# 空のリスト
li2 = []

print(len(li2)) # 0

値を取り出す

リストの各要素の値を取得する場合は、 リスト名[]角括弧の中に取得したい要素のインデックス(添え字)を指定します。

リスト名[インデックス]

先頭の要素のインデックスは「0」、2番目の要素のインデックスは「1」です。

インデックスを指定して各要素の値を取得してみます。

li  = ["a", "b", "c"]

# 先頭の要素
print(li[0])  # a

# 2番目
print(li[1])  # b

# 3番目
print(li[2])  # c

indexと値のペアを取得 enumerate()

リストのインデックスと値のペアを順番に取得したい場合は、 enumerate()関数を使います。
インデックスと値の両方を知りたい時に便利な関数です。

書式
enumerate(リスト)

enumerateの引数には、リストだけでなく タプルなどのリテラブルなオブジェクトを指定できます。 戻り値はインデックスと値のタプルです。

enumerate()関数を使う場合は、通常次のように記述します。

li = ["a", "b", "c"]

for i, v in enumerate(li):
	print(i, v)

上の場合は「i」にインデックス、「v」に値が入ってきます。

実行結果
0 a
1 b
2 c

タプルとして取得

上の例ではインデックスと値を別々の変数で取得しましたが、 タプルとして取得することもできます。

li = ["a", "b", "c"]

for t in enumerate(li):
	print(t)
実行結果
(0, 'a')
(1, 'b')
(2, 'c')

スライス(範囲指定) []

範囲を指定してリストの要素を取り出す場合は、 []角括弧を使ってインデックスの範囲を指定します。

書式
リスト[開始インデックス:終了インデックス+1]

リストの先頭要素のインデックスは「0」です。

具体的なコードは次の通りです。

li  = ["a", "b", "c", "d", "e"]

# 先頭から3番目まで
print(li[0:3])  # ['a', 'b', 'c']

# 2番目から4番目まで
print(li[1:4])  # ['b', 'c', 'd']

インデックスを省略した場合

最初のインデックスを省略した場合は「0」指定と同じになり、 終了のインデックスを省略した場合は「要素数」指定と同じになります。

li  = ["a", "b", "c", "d", "e"]

# li[0:3] と同じ
print(li[:3])  # ['a', 'b', 'c']

# li[1:len(li)] と同じ
print(li[1:])  # ['b', 'c', 'd', 'e']

ステップ数(間隔)を指定する

要素を取り出すステップ数(間隔)を指定することもできます。 次のように終了インデックスの次にステップ数を指定します。

リスト[開始インデックス:終了インデックス + 1:ステップ数]
li  = ["a", "b", "c", "d", "e", "f", "g"]

# ステップ数を指定
print(li[::2])  # ['a', 'c', 'e', 'g']

# 2番目の文字からステップ数2で取り出す
print(li[1::2])  # ['b', 'd', 'f']

リスト要素の値を変更

リストの要素の値を変更する場合は、 インデックスで指定した要素に値を代入します。

リスト名[インデックス] = 値

リストは変更可能(イミュータブル)なデータ型です。
Pythonで使用するコレクションの変更可能/不可情報は次の通り。

データ型変更可能/不可
リスト
タプル×
ディクショナリ(辞書)
セット

要素の値を変更するコード例です。

li  = ["a", "b", "c"]

# 先頭要素の値を変更
li[0] = "x"

# 2番目の要素の値を変更
li[1] = "y"

print(li) # ['x', 'y', 'c']

末尾に追加 append()

リストの末尾に要素を追加する場合は、 append()メソッドを使用します。

書式
リスト.append(値)
li  = ["a", "b", "c"]

li.append("d") 

print(li) # ['a', 'b', 'c', 'd']

li.append("e")

print(li) # ['a', 'b', 'c', 'd', 'e']

append()メソッドはリストの末尾に追加できますが、 リストの途中に挿入することはできません。 途中に挿入したい場合は insert()メソッドを使います。

途中に挿入 insert()

リストの途中に要素を挿入する場合は、 insert()メソッドを使います。

書式
リスト.insert(インデックス, 値)

先頭要素として挿入したい場合はインデックスに「0」を指定し、 2番目の要素として挿入したい場合はインデックスに「1」を指定します。
要素数以上のインデックスを指定した場合は末尾に追加されます。

li  = ["a", "b", "c"]

# 2番目に挿入
li.insert(1, "x")

print(li) # ['a', 'x', 'b', 'c']

# 4番目に挿入
li.insert(3, "y")

print(li) # ['a', 'x', 'b', 'y', 'c']

# 要素数以上のインデックスを指定
li.insert(10, "z")

print(li) # ['a', 'x', 'b', 'y', 'c', 'z']

指定位置の要素を削除 del

リストから指定位置の要素を削除する場合は、 del文を使います。

書式
del リスト[インデックス]

先頭の要素を削除する場合、インデックスに「0」を指定します。
要素数以上のインデックスを指定するとエラーが発生します。

li  = ["a", "b", "c"]

# 2番目の要素を削除
del li[1]

print(li) # ['a', 'c']

範囲を指定して削除

del文では単体のインデックスだけでなく、 範囲を指定して削除することもできます。

書式
del リスト[削除開始インデックス:削除終了インデックス + 1]
li  = ["a", "b", "c", "d", "e", "f", "g"]

# 2番目から3番目の要素を削除
del li[1:3]

print(li) # ['a', 'd', 'e', 'f', 'g']

ステップ数を指定して削除

ステップ数を指定してリストの要素を削除することもできます。

書式
del リスト[削除開始インデックス:削除終了インデックス + 1:ステップ数]

以下のコードではステップ数に2を指定して、 奇数番目の要素を削除しています。

li  = ["a", "b", "c", "d", "e", "f", "g"]

# 奇数番目の要素を削除
del li[::2]

print(li) # ['b', 'd', 'f']

指定した値の要素を削除 remove()

リストから指定した値の要素を削除する場合は、 remove()メソッドを使います。

書式
リスト.remove(値)

値を指定して要素を削除したい場合は remove()メソッドを使い、 インデックスを指定して要素を削除したい場合は del文を使います。

li  = ["a", "b", "c"]

# "a" の要素を削除
li.remove("a")

print(li) # ['b', 'c']

指定した値の要素が複数存在する場合は、 最初の要素を削除します。

次のコードは、値が"a"の要素を削除しています。 ですが値が"a"の要素は複数あるため 2番目の"a"の要素は残っています。

li  = ["a", "b", "c", "a", "b", "c"]

# "a" の要素を削除
li.remove("a")

print(li) # ['b', 'c', 'a', 'b', 'c']

指定した値の「すべて」の要素を削除する

指定した値の「すべて」の要素を削除したい場合は いくつか方法がありますが、 while文を使った次の方法がシンプルでわかりやすいと思います。

li  = ["a", "b", "c", "a", "b", "c"]

# "a" の要素を全て削除
while "a" in li:
	li.remove("a")

print(li) # ['b', 'c', 'b', 'c']

要素を結合 join()

Pythonではリストなどのコレクションの要素を結合して 文字列を生成することができます。 その場合はjoin()メソッドを使います。

例えば ["a", "b", "c"] というリストの要素を結合して "a-b-c" という文字列を作れます。

書式
"結合文字".join(リストなど)

join()メソッドの引数は、リストなどのイテレート可能な(繰り返し処理が可能な) オブジェクトです。

リストを使ったjoin()メソッドの使い方は次の通りです。

li = ["a", "b", "c"]

# - ハイフンで結合
s1 = "-".join(li)

print(s1)  # a-b-c

# , カンマで結合
s2 = ",".join(li)

print(s2)  # a,b,c

# そのまま結合
s3 = "".join(li)

print(s3)  # abc

リスト内包表記

リスト内包表記とは、 リストの内容を元に、 新しいリストを作成するための特殊な表記方法です。
リスト内包表記はコンプリヘンション(comprehension)とも呼ばれ、 英単語の comprehension には「内包」や「包含」といった意味があります。

書式
[式 for 変数 in リスト if 条件]

リストをループさせる場合によく使う 「for 変数 in リスト」という表記の前後に、 「式」や「if 条件」が加わっています。 全体は [] 角括弧で括り、「if 条件」は省略可能です。

では実際にリスト内包表記を使ってみます。

リストの各要素を2倍にした新しいリストを作る

まずはすべてのリスト要素に対して2倍にした新しいリストを作成します。 「if 条件」はありません。

li = [1, 2, 3, 4]

# [式 for 変数 in リスト]
new_li = [n * 2 for n in li] 

print(new_li) # [2, 4, 6, 8]

「if 条件」付きで新しいリストを作る

次は、リストの値が偶数の時だけ2倍にした新しいリストを作成します。 「if 条件」の箇所に「偶数の場合」という条件が加わっています。

結果として要素が2つの新しいリストが作成されます。

li = [1, 2, 3, 4]

# [式 for 変数 in リスト if 条件]
new_li = [n * 2 for n in li if n % 2 == 0]

print(new_li) # [4, 8]

リスト内包表記を使わずに記述する

上で記述したコードを、 リスト内包表記を使わずに記述すると次のようになります。

li = [1, 2, 3, 4]
new_li = []

for n in li:
	if n % 2 == 0:
		new_li.append(n * 2)

print(new_li) # [4, 8]

リスト内包表記を普段使わない人でも、 他人のコードを読み解く際には必要となってきますので、 リスト内包表記はぜひおさえておいてください。