list.insert の概要(指定した位置に要素を挿入する)
list.insert は「リストの任意の位置に新しい要素を挿入する」メソッドです。書式は list.insert(index, element)。index の位置に element を入れ、以降の要素を右へシフトします。リストはその場で変更され、戻り値はありません(None)。
nums = [1, 2, 4, 5]
nums.insert(2, 3) # インデックス2の位置に 3 を挿入
print(nums) # [1, 2, 3, 4, 5]
Python基本動作とインデックスの扱い(ここが重要)
0始まりのインデックスと境界での挙動
インデックスは 0 から始まります。index が 0 未満なら先頭への挿入、リスト長以上なら末尾への挿入になります。つまり「範囲外」は安全側に丸められるため、IndexError にはなりません。挿入位置以降の要素は右へシフトし、リストの長さは 1 増えます。
letters = ["B", "C"]
letters.insert(0, "A") # 先頭へ
letters.insert(100, "D") # 末尾へ(長さ以上)
print(letters) # ["A", "B", "C", "D"]
Python負のインデックスも使える
負のインデックスは末尾基準です。-1 は「最後の要素の位置」なので、-1 を指定すると「最後の要素の前」に挿入され、-len(list) 以下なら先頭扱いになります。直感的には「スライスや参照と同じ負インデックスの規則」が適用されるイメージです。
fruits = ["apple", "banana", "orange"]
fruits.insert(-1, "grape") # "orange" の前
print(fruits) # ["apple", "banana", "grape", "orange"]
Pythonappend・extend との違いと使い分け(重要ポイントを深掘り)
append は末尾に1要素、insert は任意位置、extend は複数展開
- append(x): 末尾に「x を1要素」として追加。
- insert(i, x): 指定位置 i に「x を1要素」として挿入。
- extend(iterable): 反復可能オブジェクトの中身を「展開して複数」末尾に追加。
目的が「順序を維持しつつ途中に差し込み」なら insert、一括追加なら extend、単純な末尾追加なら append を選びます。
items = [1, 3]
items.insert(1, 2) # [1, 2, 3]
items.append(4) # [1, 2, 3, 4]
items.extend([5, 6]) # [1, 2, 3, 4, 5, 6]
Python性能と実務上の注意(シフトコスト・読みやすさ)
中間挿入は O(n) のシフトが発生する
insert は挿入位置より後ろの要素を右へずらすため、要素数に比例したコストがかかります。大量データで頻繁に中間挿入が必要なら、まとめて処理する・末尾に蓄積後に並べ替える・適切なデータ構造(deque など)を検討すると効率的です。
「見た目の意図」をコードで明示する
- 先頭挿入は insert(0, x)、末尾挿入は insert(len(lst), x) と書くと、読み手に意図が伝わります(append でも同等だが、意図の表現として使い分ける)。
- 負のインデックスは便利ですが、慣れない読者には分かりづらい場合があるため、コメントや変数名で位置の意味を補足すると親切です。
例題で身につける(定番から一歩先まで)
例題1:ソート済みリストに順序を保って挿入
既存の並びを崩さないように、挿入位置を探して差し込みます。小規模なら線形探索で十分です。
def insert_sorted(lst, x):
i = 0
while i < len(lst) and lst[i] < x:
i += 1
lst.insert(i, x)
nums = [10, 20, 40]
insert_sorted(nums, 30)
print(nums) # [10, 20, 30, 40]
Pythonこうした「中間挿入」は順序維持に向いていますが、大量件数では O(n) のコストに注意しましょう。
例題2:CSV風データにヘッダー行を追加
先頭へ差し込むと、既存データをそのままに見出しを付けられます。
rows = [
["coffee", 350, 2],
["tea", 280, 1],
]
rows.insert(0, ["item", "price", "qty"])
print(rows)
# [["item","price","qty"], ["coffee",350,2], ["tea",280,1]]
Python先頭挿入は insert(0, …) と書くことで、意図が明確になります。
例題3:末尾直前への挿入(負のインデックス)
最後の要素の手前に新しい要素を入れます。区切り行やフッター直前の追記に便利です。
lines = ["header", "body", "footer"]
lines.insert(-1, "summary")
print(lines) # ["header", "body", "summary", "footer"]
Python負のインデックスの直感的な位置指定が活きる使い方です。
例題4:複数挿入を安全に行う(位置ずれ対策)
連続で insert すると位置がずれて意図せぬ順序になることがあります。高い位置から順に挿入する、または一度に構築するのが安全です。
lst = ["A", "D"]
# 高い位置から挿入
lst.insert(1, "C") # ["A","C","D"]
lst.insert(1, "B") # ["A","B","C","D"]
print(lst)
Python「インデックスが後ろへシフトする」性質を踏まえ、順序を計画しましょう。
まとめ
list.insert は「任意位置へ1要素を挿入」できる柔軟なメソッドで、append(末尾)、extend(複数展開)と使い分けることで、意図どおりのリスト構築ができます。範囲外インデックスは安全側に丸められ、負のインデックスも直感的に使えます。一方で中間挿入は O(n) のシフトコストがかかるため、大規模データではまとめ方やデータ構造の選択を意識すると良いです。先頭や末尾、負のインデックスなど「位置の意図」をコードで明示し、例題の型で練習すれば、初心者でも読みやすく正確な挿入ロジックを書けます。
