Python - リスト

リスト

Python には文字列以外にリストタプルの 2 種類のシーケンス構造があり、0 個以上の要素を持つことができます。リストは [, ] でデータを囲み、タプルは (, ) でデータを囲みます。

list = [1, 2, 3]
print(type(list))
# <class 'list'>

tuple = (1, 2, 3)
print(type(tuple))
# <class 'tuple'>
リストとタプル

それぞれの違いは、リストはデータがミュータブル (可変) であり、タプルはデータがイミュータブル (不変) になります。ミュータブルであるリストは、要素の挿入や削除を行うことができますが、イミュータブルであるタプルは要素の変更を伴う関数は使用できません。

リストで使用できる関数は以下のとおりです。

  • append
  • clear
  • copy
  • count
  • extend
  • index
  • insert
  • pop
  • remove
  • reverse
  • sort

タプルで使用できる関数は以下のとおりです。

  • count
  • index

上記のようにタプルは要素に対して変更や削除を行うための関数がありません。また、要素に対して直接変更を行う場合もエラーとなります。

list = [1, 2, 3]
list[0] = 4
print(list)
# [4, 2, 3]

tuple = (1, 2, 3)
tuple[0] = 4
print(tuple)
# 'tuple' object does not support item assignment
リストとタプル

リスト型への変換

文字列をリスト型に変換する方法は、以下のように行います。

print(list('cat'))
# ['c', 'a', 't']
文字列をリスト型に変換

split() 関数を使えば、任意のセパレータ文字列に対して分割することができます。

birthday = '1982/07/01'
print(birthday.split('/'))
# ['1982', '07', '01']
文字列をリスト型に変換

ただし、文字列に複数のセパレータ文字列が連続している場合、リスト要素としては空文字が設定されます。

splitme = 'a/b//c/d///e'
print(splitme.split('/'))
# ['a', 'b', '', 'c', 'd', '', '', 'e']
文字列をリスト型に変換

リスト要素の取り出し

オフセットを指定すればリストからも個々の要素を取り出すことができます。

list = ['A', 'B', 'C']
print(list[0])
# A
print(list[1])
# B
print(list[2])
# C
オフセットを使った要素の取り出し

マイナスのインデックスを使えば末尾から逆に取り出すこともできます。

list = ['A', 'B', 'C']
print(list[-1])
# C
print(list[-2])
# B
print(list[-3])
# A
オフセットを使った要素の取り出し

スライスを使うと、リストのサブシーケンスを取り出すことができます。

list = ['A', 'B', 'C']
print(list[0:2])
# ['A', 'B']
スライスを使った要素の取り出し

スライスは 1 以外のステップを指定することもできます。以下の例では、先頭から右にひとつおきに要素を取り出しています。

list = ['A', 'B', 'C']
print(list[::2])
# ['A', 'C']
スライスを使った要素の取り出し

次の例では、末尾から左にひとつおきに要素を取り出しています。

list = ['A', 'B', 'C']
print(list[::-2])
# ['C', 'A']
スライスを使った要素の取り出し

スライスを使ったテクニックで、リストの要素を逆順にすることもできます。

list = ['A', 'B', 'C']
print(list[::-1])
# ['C', 'B', 'A']
スライスを使った要素の取り出し

リスト要素の追加と削除

リストに要素を追加するための方法のひとつとして append() 関数があります。append() 関数を使うと、末尾に要素をひとつずつ追加することができます。

list = ['A', 'B', 'C']
list.append('D')
print(list)
# ['A', 'B', 'C', 'D']
append() 関数を使ったリスト要素の追加

extend() 関数を使うと、ふたつのリストをひとつにまとめることができます。

list1 = ['A', 'B', 'C', 'D']
list2 = ['E', 'F']
list1.extend(list2)
print(list1)
# ['A', 'B', 'C', 'D', 'E', 'F']
extend() 関数を使ったリスト要素の追加

このときに append() 関数を使うと、others の要素が追加されるのではなく、others が 1 個のリスト要素として追加されてしまいます。

list1 = ['A', 'B', 'C', 'D']
list2 = ['E', 'F']
list1.append(list2)
print(list1)
# ['A', 'B', 'C', 'D', ['E', 'F']]
append() 関数を使ったリスト要素の追加

append() 関数は、リストの末尾にしか要素を追加できません。リストのオフセットを指定し、その前に要素を追加したいときには、insert() 関数を使います。オフセット 0 を指定すると、リストの先頭に挿入されます。末尾、または末尾を越えるオフセットを指定すると、append() 関数と同じようにリストの末尾に挿入されます。

list = ['A', 'B', 'C', 'D']
list.insert(3, 'X')
print(list)
# ['A', 'B', 'C', 'X', 'D']

list.insert(10, 'Y')
print(list)
# ['A', 'B', 'C', 'X', 'D', 'Y']
insert() 関数を使ったリスト要素の追加

要素を削除する場合は、del を使用します。要素を削除した場合、その後ろの要素は前に移動して削除された要素のスペースを埋め、リストの長さは 1 だけ小さくなります。

list = ['A', 'B', 'C', 'E', 'D']
print(list[2])
# C

del list[2]
print(list)
# ['A', 'B', 'E', 'D']

print(list[2])
# E
del を使ったリスト要素の削除

削除したい要素がリストのどこにあるか分からない場合は、remove() 関数を使用します。remove() 関数は、値を指定して要素を削除することができます。

list = ['A', 'B', 'C', 'E', 'D']
list.remove('E')
print(list)
# ['A', 'B', 'C', 'D']
remove() 関数を使ったリスト要素の削除

pop() 関数を使えば、リストから要素を取り出し、同時にリストからその要素を削除することができます。オフセットを指定して pop() 関数を呼び出すと、そのオフセットの要素が返されます。引数を指定しなければ、オフセットとして -1 が使われます。

list = ['A', 'B', 'C', 'D']
print(list.pop())
# D
print(list)
# ['A', 'B', 'C']
print(list.pop(1))
# B
print(list)
# ['A', 'C']
pop() 関数を使ったリスト要素の取り出し (取得と削除)

要素の値からその要素のリスト内でのオフセットを知りたい場合には、index() 関数を使います。もしも、リストに存在しない要素が指定された場合、ValueError が発生します。

list = ['A', 'B', 'C', 'D']
print(list.index('B'))
# 1
index() 関数を使ったリスト要素のオフセット位置の確認

リスト内に要素があるかテストするには、in を使います。

list = ['A', 'B', 'C', 'D']
print('A' in list)
# True
print('X' in list)
# False
in を使ったリスト内に要素があるかのテスト

ただし、リスト内には複数の位置に同じ値が格納されている場合があります。in を使ったテストでは、少なくとも 1 つ以上の要素があれば Ture を返します。

words = ['a', 'deer', 'a' 'female', 'deer']
print('deer' in words)
# True
in を使ったリスト内に要素があるかのテスト

リスト要素の計算と変換

特定の値がリスト内にいくつ含まれているかを数えるには、count() 関数を使います。

list = ['A', 'B', 'C']
print(list.count('C'))
# 1
print(list.count('X'))
# 0
count() 関数を使った値の個数の計算

文字列関数の join() 関数を使うことで文字列への変換を行うこともできます。join() 関数はリスト関数ではありませんが、引数にはイテラブルオブジェクトを指定できるため、以下のように実装できます。

list = ['A', 'B', 'C']
print(', '.join(list))
# 'A, B, C'
join() 関数を使った文字列への変換

リスト要素を値の順序で並べ替える場合は、sort() 関数、または sorted() 関数を使います。リスト関数の sort() 関数は、指定したリスト自体をソートします。汎用関数の sorted() 関数は、ソートされたリストのコピーを返します。リストの要素が数値ならデフォルトで数値の昇順でソートされ、要素が文字列なら、アルファベット順でソートされます。

list = ['B', 'A', 'C']
sorted_list = sorted(list)
print(sorted_list)
# ['A', 'B', 'C']
print(list)
# ['B', 'A', 'C']
sorted() 関数を使ったリストの並び替え

sorted_list はコピーであり、これを作ってもオリジナルのリストは変更されません。しかし、list からリスト関数の sort() 関数を呼び出すと、list 自体が書き換えられます。

list = ['B', 'A', 'C']
list.sort()
print(list)
# ['A', 'B', 'C']
sort() 関数を使ったリストの並び替え

基本的に sort() 関数を使う場合は、リストの要素がすべて同じ型である必要があります。ただし、異なる型が混ざっていても正しく動作する場合があります。例えば、intfloat が同じリストに混在していても Python が自動的に変換できるため問題なく動作します。

numbers = [2, 1, 4.0, 3]
numbers.sort()
print(numbers)
# [1, 2, 3, 4.0]
sort() 関数を使ったリストの並び替え

デフォルトのソート順は昇順ですが、引数として reverse=True を追加すれば降順になります。

numbers = [2, 1, 4.0, 3]
numbers.sort(reverse=True)
print(numbers)
# [4.0, 3, 2, 1]
sort() 関数を使ったリストの並び替え

len() 関数は、リスト内の要素数を返す。

list = ['A', 'B', 'C']
print(len(list))
# 3
len() 関数を使ったリストの長さの取得

関連記事