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]
6個のセルからなるリスト。正のインデックス 0..5 が上に、 負のインデックス -6..-1 が各セルの下にある。

正のインデックスは先頭から数え、負のインデックスは末尾から数えます。

スライス構文は、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 への追加は b を通じて見える。

ab は両方とも同じリストを指しています。どちらかの名前を通じて変更すると、他のすべての名前が見る内容が変わります。

>>> 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

これは 最上位 のリストだけをコピーします。ネストされたリストは、元とコピーの間で依然として共有されます。