一覧PG-08-1 · コレクションの操作

リストとスライス

重複する色名の一覧を使い、末尾への追加、部分列の変更、値や位置による削除を行います。各操作の前後で並びと長さを確認し、最後にタプルとして取り出します。

説明

リストは値を順序付きで保持し、先頭を0とする添字で位置を指定します。負の添字は末尾からの位置、スライスは複数の位置をまとめて取り出す記法です。

重複する色名の一覧を使い、末尾への追加、部分列の変更、値や位置による削除を行います。各操作の前後で並びと長さを確認し、最後にタプルとして取り出します。

1添字と値の対応

redが二箇所にある一覧を作り、添字を付けて表示します。

items = ["red", "blue", "red", "green"]重複を含む一覧; print(list(enumerate(items))添字と値の対応); print(items[0], items[2], items[-1])正負の添字

0と2は同じredという値ですが、別の位置です。-1は末尾のgreenを指します。enumerateは位置と値を組で取り出すために使っています。

2末尾が変わると-1の対象も変わる

yellowを一つ追加します。固定位置3と末尾-1を再表示します。

items.append("yellow")末尾へ一要素追加; print(items, len(items))並びと長さ; print(items[3], items[-1])固定位置と末尾

長さは5になり、位置3はgreenのまま、-1はyellowへ変わります。末尾を指したい場合と、特定の位置を保持したい場合では使う添字の意味が異なります。

3一つの位置を置き換える

位置1のblueをcyanへ変えます。

items[1] = "cyan"既存の位置へ再代入; print(items, len(items))長さを保った変更

長さ5は変わらず、位置1の値だけが変わりました。存在する位置への代入と、末尾への追加は別の操作です。

4部分列は外側が別のリストになる

位置1から4未満を取り出し、その先頭だけをblackへ変えます。

part = items[1:4]終点4を含まない部分列; part[0] = "black"部分列側の位置を変更; print(part, items)元の一覧と比較; print(items[::2], items[::-1])幅と方向を指定

partはblack・red・greenですが、itemsの位置1はcyanのままです。スライスは新しい外側のリストを作ります。::2は一つおき、::-1は逆順です。入れ子の要素まで深く複製する操作ではありません。

5appendとextendの違い

二つの色名をリストにまとめ、appendとextendへそれぞれ渡します。

items.append(["white", "gray"])リストを一要素として追加; print(items, len(items))追加直後; items.extend(["white", "gray"])要素を順に追加; print(items, len(items))展開後

appendはリスト自体を一要素として追加するので長さ6、extendは二つの文字列を順に追加して長さ8になります。渡したオブジェクトを一つ入れるか、その要素を展開するかが違います。

6位置で取り出して削除する

popの位置を省略し、末尾の一要素を取り出します。

removed = items.pop()末尾を取り出して削除; print(removed, items, len(items))戻り値と残り

最後のgrayが戻り値となり、一覧から除かれます。途中の入れ子リストにあるgrayは別の位置なので残ります。

7値で削除すると最初の一致が対象

redを値で指定して削除します。

items.remove("red")最初に一致する値を削除; print(items, items.count("red"))残った値と出現数

最初のredだけが消え、もう一つは残ります。removeの引数は位置ではなく値です。重複を全て除く操作ではないため、対象の出現回数も確認します。

8範囲外の添字とスライス

同じ範囲外99を、スライスと単一添字で使います。

print(items[99:100])範囲外の部分列; print(items[99])範囲外の単一位置

スライスは境界へ調整されて空リスト、単一添字はIndexErrorです。部分列が空になることと、一つの要素を取得できないことは、異なる結果として扱われます。

9二要素をタプルで受け取る

先頭二つをタプルへ変換し、二つの名前へ取り出します。

pair = tuple(items[:2])二要素をタプル化; first, second = pair役割を持つ名前へ展開; print(pair, first, second, len(pair))組と各要素

cyanとredの二要素です。アンパックは要素数に対応する名前へ割り当てます。タプルは位置の参照を後から差し替えられませんが、要素がリストならその内側まで不変になるわけではありません。

まとめ

値と位置、単一添字とスライスの意味を確認します。

追加・展開・位置削除・値削除で、並びと長さがどう変わるか追います。

操作履歴と解説を振り返れます。

Python 3

1
items = ["red", "blue", "red", "green"]; print(list(enumerate(items))); print(items[0], items[2], items[-1])
[(0, 'red'), (1, 'blue'), (2, 'red'), (3, 'green')]
red red green
2
items.append("yellow"); print(items, len(items)); print(items[3], items[-1])
['red', 'blue', 'red', 'green', 'yellow'] 5
green yellow
3
items[1] = "cyan"; print(items, len(items))
['red', 'cyan', 'red', 'green', 'yellow'] 5
4
part = items[1:4]; part[0] = "black"; print(part, items); print(items[::2], items[::-1])
['black', 'red', 'green'] ['red', 'cyan', 'red', 'green', 'yellow']
['red', 'red', 'yellow'] ['yellow', 'green', 'red', 'cyan', 'red']
5
items.append(["white", "gray"]); print(items, len(items)); items.extend(["white", "gray"]); print(items, len(items))
['red', 'cyan', 'red', 'green', 'yellow', ['white', 'gray']] 6
['red', 'cyan', 'red', 'green', 'yellow', ['white', 'gray'], 'white', 'gray'] 8
6
removed = items.pop(); print(removed, items, len(items))
gray ['red', 'cyan', 'red', 'green', 'yellow', ['white', 'gray'], 'white'] 7
7
items.remove("red"); print(items, items.count("red"))
['cyan', 'red', 'green', 'yellow', ['white', 'gray'], 'white'] 1
8
print(items[99:100]); print(items[99])
[]
Traceback (most recent call last):
  File "<console>", line 1, in <module>
IndexError: list index out of range
9
pair = tuple(items[:2]); first, second = pair; print(pair, first, second, len(pair))
('cyan', 'red') cyan red 2

演習完了