2.7. リスト¶
リスト はミュータブルで順序付けされた値のシーケンスです。文字列やバイト列とは異なり、リストは任意の型の値を保持でき、要素をその場で変更、追加、削除できます。
2.7.1. リストの作成¶
角かっこでリストリテラルを作成します:
empty = []
nums = [1, 2, 3]
mixed = [1, "two", 3.0, True, None] # any types
nested = [[1, 2], [3, 4], [5, 6]] # lists of lists
list コンストラクタは、任意のイテラブルからリストを構築します:
>>> list("abc")
['a', 'b', 'c']
>>> list(range(5))
[0, 1, 2, 3, 4]
2.7.2. 長さ、インデックス指定、スライス¶
len() は要素の数を返します。インデックス指定とスライスは文字列と同じように動作します。位置は0から始まり、負のインデックスは末尾から数え、有効範囲外のスライスは例外を送出せず黙ってクリップされます:
>>> nums = [10, 20, 30, 40, 50]
>>> len(nums)
5
>>> nums[0]
10
>>> nums[-1]
50
>>> nums[1:4]
[20, 30, 40]
正のインデックスは先頭から数え、負のインデックスは末尾から数えます。¶
スライス構文は、Pythonが裏で構築する slice オブジェクトの省略形です。nums[1:4] は nums[slice(1, 4)] と同じです。手作業で構築することはまれですが、スライスを再利用するために値として保存する際に slice() がときどき役立ちます:
head = slice(0, 3)
print(nums[head]) # [10, 20, 30]
print(letters[head]) # first three letters, same slice
2.7.3. リストの変更¶
リストはその場でのインデックス付き代入とスライス代入をサポートします:
>>> nums = [10, 20, 30]
>>> nums[0] = 99
>>> nums
[99, 20, 30]
>>> nums[1:3] = [200, 300, 400] # slice can change the length
>>> nums
[99, 200, 300, 400]
最も一般的なリストメソッド:
list.append()-- 末尾に単一の要素を追加します。list.extend()-- イテラブルのすべての要素を追加します。list.insert()-- 指定した位置に挿入します。list.remove()-- 値の最初の出現を削除します。list.pop()-- 要素を削除して返します(デフォルトは末尾)。list.clear()-- すべての要素を削除します。list.sort()-- その場でソートします。降順にするにはreverse=Trueを渡します。list.reverse()-- その場で逆順にします。
>>> nums = []
>>> nums.append(1)
>>> nums.extend([2, 3])
>>> nums.insert(0, 99)
>>> nums
[99, 1, 2, 3]
>>> nums.pop()
3
>>> nums.sort()
>>> nums
[1, 2, 99]
これらのメソッドはリストをその場で変更し、None を返します。次のように書くのは
nums = nums.sort() # nums is now None -- common bug
ほぼ確実にあなたの望むものではありません。元の nums はソートされますが、代入によって名前が戻り値で上書きされてしまいます。nums.sort() を単独の行で呼び出すか、組み込みの sorted() を使って、元のリストを変更せずに新しいソート済みリストを取得してください。
2.7.4. 演算子¶
+は2つのリストを連結して新しいリストを作ります。*はリストを繰り返します。inはメンバーシップをテストします。
>>> [1, 2] + [3, 4]
[1, 2, 3, 4]
>>> [0] * 5
[0, 0, 0, 0, 0]
>>> 3 in [1, 2, 3]
True
2.7.5. リストの反復処理¶
for ループは要素を順に巡回します:
for n in [10, 20, 30]:
print(n)
2.7.6. エイリアシングと変更¶
リストはメモリ上の単一の値であり、複数の名前が同じリストを指すことができます。1つの名前を通じて変更すると、同じリストを指す他のすべての名前を通じてその変更が見えます。
a と b は両方とも同じリストを指しています。どちらかの名前を通じて変更すると、他のすべての名前が見る内容が変わります。¶
>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> b
[1, 2, 3, 4] # same object, change is visible
独立したコピーを作るには、リスト全体をスライスするか、list コンストラクタを呼び出します:
>>> c = a[:] # or list(a)
>>> a.append(5)
>>> c
[1, 2, 3, 4] # c is unaffected
これは 最上位 のリストだけをコピーします。ネストされたリストは、元とコピーの間で依然として共有されます。