リストやタプルを使うと複数の要素をまとめて管理できます.さらに,個々の要素はリストやタプルであっても良いでしょう.リストとタプルの違いは,リストがミュータブルで,タプルがイミュータブルであることです.つまり,リストの要素は書き換えが可能で,要素の追加や削除もできるのに対し,タプルは一旦定義すれば書き換えはできなくなります.
リストを作成するには,カンマで区切って [ ]
で囲います.あるいは,list()
で空のリストを作成します.例えば,4つの得点をまとめて管理する scores
というリストを作成します.
scores = [10, 30, 25, 20]
print(scores)
[10, 30, 25, 20]
次に,4人の名前をまとめて管理する names
というリストを作成します.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
print(names)
['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
空のリストを2種類の方法で作成します.
empty_names = []
empty_scores = list()
print(empty_names)
print(empty_scores)
[] []
次のように記述するとリストをゼロで初期化して作成することもできます.
five_scores = [0] * 5
print(five_scores)
[0, 0, 0, 0, 0]
何らかのパターンを繰り返すようなリストを作成することも可能です.
nine_scores = [10, 20, 30] * 3
print(nine_scores)
[10, 20, 30, 10, 20, 30, 10, 20, 30]
さらに,range()
と list()
を組み合わせれば,連続した値のリストを生成することも可能です.range()
による数値シーケンスの詳細はこちらを参照してください.
ten_scores = list(range(0, 10))
print(ten_scores)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
要素の先頭がオフセット0になることに注意する必要があります.また,負のオフセットを使えば末尾から逆に数えます.この考え方は文字列の抽出と同じです.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
print(names[0])
print(names[3])
print(names[-2])
Tanaka Takahashi Watanabe
文字列と同様にスライスが利用できます.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
print(names[1:3])
print(names[:2])
print(names[2:])
['Sato', 'Watanabe'] ['Tanaka', 'Sato'] ['Watanabe', 'Takahashi']
オフセットで指定すれば良いでしょう.例えばオフセット1(つまり先頭から2要素目)の「Sato」を「Kato」に書き換えてみます.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
names[1] = 'Kato'
print(names)
['Tanaka', 'Kato', 'Watanabe', 'Takahashi']
リストの末尾に要素を追加するには append()
メソッドを利用します.なお,append()
メソッドで追加できる要素の個数は1個に限られます.例えば「Okada」を末尾に追加します.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
names.append('Okada')
print(names)
['Tanaka', 'Sato', 'Watanabe', 'Takahashi', 'Okada']
リストの末尾に複数の要素をまとめて追加するには extend()
メソッドを利用します.例えば「Okada」と「Tanabe」を末尾に追加します.このとき,追加したい要素を [ ]
で囲ってリストとして渡す必要があることに注意してください.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
names.extend(['Okada', 'Tanabe'])
print(names)
['Tanaka', 'Sato', 'Watanabe', 'Takahashi', 'Okada', 'Tanabe']
リストの途中に要素を追加します.例えば,先頭を0番目として2番目に「Okada」を追加します.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
names.insert(2, 'Okada')
print(names)
['Tanaka', 'Sato', 'Okada', 'Watanabe', 'Takahashi']
オフセットを指定して要素を削除するには del
を使います.例えば,先頭を0番目とした2番目の「Watanabe」を削除します.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
del names[2]
print(names)
['Tanaka', 'Sato', 'Takahashi']
指定した値を削除するには remove()
を使います.「Watanabe」を検索してその値を削除します.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
names.remove('Watanabe')
print(names)
['Tanaka', 'Sato', 'Takahashi']
ただし,先頭から検索された最初の要素しか削除しません(Python 3.5.3 および 3.9.12 で確認).次の names
リストには「Watanabe」が3個含まれていますが,最初の要素しか削除されないことに注意してください.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi', 'Watanabe', 'Watabe', 'Tanabe', 'Watanabe']
names.remove('Watanabe')
print(names)
['Tanaka', 'Sato', 'Takahashi', 'Watanabe', 'Watabe', 'Tanabe', 'Watanabe']
pop()
でインデックスを指定するとその要素を取り出すことができ,さらに取り出した要素がリストから削除されます.例えばインデックス 1 の 'Sato' を取り出します.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
names.pop(1)
'Sato'
この作業によりリスト name
から 'Sato' が削除されました.
names
['Tanaka', 'Watanabe', 'Takahashi']
再びインデックス 1 の要素を pop()
で取り出します.
names.pop(1)
'Watanabe'
取り出された 'Watanabe' が削除されたことが確認できます.
names
['Tanaka', 'Takahashi']
なお,pop()
でインデックスを省略すると最後の要素(つまりインデックス -1)が削除されます.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
names.pop()
'Takahashi'
names
['Tanaka', 'Sato', 'Watanabe']
この pop()
と append()
を組み合わせて使うと,キューやスタックといったデータ構造を作成することができます.
「Watanabe」 という要素がリストの何番目にあるか知りたい場合には index
を使います.結果はリストの先頭を0番目としたインデックス(つまりオフセット)で得られます.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
idx = names.index('Watanabe')
print(idx)
2
ただし,検索したい値がリストに複数含まれていても最初に見つかったインデックスしか得ることができないことに注意してください.次の例では「Watanabe」が3個含まれていますが,最初ののインデックスだけが得られています.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi', 'Sato', 'Watanabe', 'Watanabe']
idx = names.index('Watanabe')
print(idx)
2
値があるかどうか調べるには in
を使います.値があれば True
,なければ False
が返ります.これは if 文による条件分岐を行うときによく利用されます.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
'Watanabe' in names
True
'Tanabe' in names
False
count()
を使えば良いでしょう.「Watanabe」は3個ありますが,「Abe」は存在しません.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi', 'Watanabe', 'Watabe', 'Tanabe', 'Watanabe']
names.count('Watanabe')
3
names.count('Abe')
0
リストを逆順に並べ替えたいときには reverse()
メソッドを使います.このとき,names
リストそのものが(破壊的に)逆順になることに注意してください.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
names.reverse()
print(names)
['Takahashi', 'Watanabe', 'Sato', 'Tanaka']
sort()
関数は(破壊的に)リストそのものを並べ替えます.これに対して,sorted()
は並べ替えたリストを返す関数で,リストそのものを書き換えるわけではありません.
names そのものを並べ替えました.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
names.sort()
print(names)
['Sato', 'Takahashi', 'Tanaka', 'Watanabe']
names を並べ替えた結果を sorted_names に代入するだけで,names 自体は書き換えません.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
sorted_names = sorted(names)
print(sorted_names)
print(names)
['Sato', 'Takahashi', 'Tanaka', 'Watanabe'] ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
リストに何個の値が入っているか,つまりリストの長さを調べるには len
を使えば良いでしょう.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
l = len(names)
print(l)
4
変数と同じような感覚でリストにリストを代入すると,思わぬ結果になる可能性があるので注意が必要です.変数の場合は,例えば変数 score
を変数 new_score
に代入したあと new_score
の値を変更しても,score
はその影響を受けることはありません.
score = 10
new_score = score
new_score += 5
print(score)
print(new_score)
10 15
しかしながら,リストにリストを代入したあと一方の値を変更すると,他方にも影響が及びます.つまり,リストの代入では新たなリストができているわけではなく,scores
も new_scores
も同じ実体を参照していることになります.
scores = [10, 30, 25, 20]
new_scores = scores # リストの代入
new_scores[0] += 5 # この変更が scores にも影響する
scores[3] = 0 # この変更が new_scores にも影響する
print(scores)
print(new_scores)
[15, 30, 25, 0] [15, 30, 25, 0]
リストを複製して新たなリストを作りたい場合は,copy()
メソッドを使います.この場合は一方の値を変更しても他方に影響は及びません.
scores = [10, 30, 25, 20]
new_scores = scores.copy() # リストの複製
new_scores[0] += 5
scores[3] = 0
print(scores)
print(new_scores)
[10, 30, 25, 0] [15, 30, 25, 20]
文字列を単語に区切って,つまり空白文字で分割して,リストに変換します.
sent = 'Processing strings in Python is relatively easy.'
words = sent.split(' ')
print(words)
['Processing', 'strings', 'in', 'Python', 'is', 'relatively', 'easy.']
上の例では最後のピリオドの処理に不満が残ります.この問題を解決するには strip
を使って両端の「.
」を取り除いてから split
で分割する方法があります.
sent = 'Processing strings in Python is relatively easy.'
words = sent.strip('.').split(' ')
print(words)
['Processing', 'strings', 'in', 'Python', 'is', 'relatively', 'easy']
Python のリストは非常に自由度が高く,リストの要素にリストを含めたり,型の異なる要素を含めたりできます.例えば,kpc
というキャンパスには3つの学部が存在し,kac
には2つの学部が存在するとします.さらに,kgu
という学校法人には kpc
と kac
という2つのキャンパスの他に,附属の高学校と中学校が存在する状況を一つのリスト kgu
で表現することができます.次のようにリストを作成したあと,インデックスを指定すれば必要なデータを取り出すことができます.
kpc = ['law', 'business', 'pharmacy']
kac = ['nutrition', 'economics']
kgu = [kpc, kac, 'high school', 'middle school']
print(kgu)
print(kpc[1])
print(kgu[0])
print(kgu[0][1])
[['law', 'business', 'pharmacy'], ['nutrition', 'economics'], 'high school', 'middle school'] business ['law', 'business', 'pharmacy'] business