リストとスライス
重複する色名の一覧を使い、末尾への追加、部分列の変更、値や位置による削除を行います。各操作の前後で並びと長さを確認し、最後にタプルとして取り出します。
説明
リストは値を順序付きで保持し、先頭を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
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
items.append("yellow"); print(items, len(items)); print(items[3], items[-1])['red', 'blue', 'red', 'green', 'yellow'] 5 green yellow
items[1] = "cyan"; print(items, len(items))['red', 'cyan', 'red', 'green', 'yellow'] 5
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']
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
removed = items.pop(); print(removed, items, len(items))gray ['red', 'cyan', 'red', 'green', 'yellow', ['white', 'gray'], 'white'] 7
items.remove("red"); print(items, items.count("red"))['cyan', 'red', 'green', 'yellow', ['white', 'gray'], 'white'] 1
print(items[99:100]); print(items[99])[] Traceback (most recent call last): File "<console>", line 1, in <module> IndexError: list index out of range
pair = tuple(items[:2]); first, second = pair; print(pair, first, second, len(pair))('cyan', 'red') cyan red 2演習完了