Python | データ構造:list.insert

Python
スポンサーリンク

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"]
Python

append・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) のシフトコストがかかるため、大規模データではまとめ方やデータ構造の選択を意識すると良いです。先頭や末尾、負のインデックスなど「位置の意図」をコードで明示し、例題の型で練習すれば、初心者でも読みやすく正確な挿入ロジックを書けます。

タイトルとURLをコピーしました