Python insert() - List 插入元素

insert() 方法用來在 list 的指定位置插入元素。

基本用法

fruits = ["apple", "orange"]
fruits.insert(1, "banana")
print(fruits)  # ['apple', 'banana', 'orange']

語法

list.insert(index, element)
  • index:要插入的位置索引
  • element:要插入的元素
  • 回傳:None(直接修改原 list)

插入位置

numbers = [1, 2, 3, 4, 5]

# 在開頭插入(索引 0)
numbers.insert(0, 0)
print(numbers)  # [0, 1, 2, 3, 4, 5]

# 在中間插入
numbers = [1, 2, 4, 5]
numbers.insert(2, 3)
print(numbers)  # [1, 2, 3, 4, 5]

# 在末尾插入
numbers = [1, 2, 3]
numbers.insert(len(numbers), 4)
print(numbers)  # [1, 2, 3, 4]

負數索引

numbers = [1, 2, 3, 4]

# 在倒數第一個位置插入
numbers.insert(-1, 3.5)
print(numbers)  # [1, 2, 3, 3.5, 4]

超出範圍的索引

索引超出範圍時不會報錯:

numbers = [1, 2, 3]

# 索引大於長度,會插入到末尾
numbers.insert(100, 4)
print(numbers)  # [1, 2, 3, 4]

# 負數索引超出範圍,會插入到開頭
numbers.insert(-100, 0)
print(numbers)  # [0, 1, 2, 3, 4]

insert() vs append()

# insert() 可以插入到任何位置
numbers = [1, 2, 4]
numbers.insert(2, 3)
print(numbers)  # [1, 2, 3, 4]

# append() 只能加到末尾
numbers = [1, 2, 3]
numbers.append(4)
print(numbers)  # [1, 2, 3, 4]

# 在末尾插入,append() 效率較高
numbers.insert(len(numbers), 5)  # O(1) 但較慢
numbers.append(6)                 # O(1) 且較快

實際範例

維持排序順序插入

def insert_sorted(lst, value):
    for i, item in enumerate(lst):
        if value < item:
            lst.insert(i, value)
            return
    lst.append(value)

numbers = [1, 3, 5, 7]
insert_sorted(numbers, 4)
print(numbers)  # [1, 3, 4, 5, 7]

insert_sorted(numbers, 0)
print(numbers)  # [0, 1, 3, 4, 5, 7]

insert_sorted(numbers, 10)
print(numbers)  # [0, 1, 3, 4, 5, 7, 10]

建立優先佇列

def insert_by_priority(queue, item, priority):
    for i, (_, p) in enumerate(queue):
        if priority < p:
            queue.insert(i, (item, priority))
            return
    queue.append((item, priority))

tasks = []
insert_by_priority(tasks, "Low task", 3)
insert_by_priority(tasks, "High task", 1)
insert_by_priority(tasks, "Medium task", 2)

print(tasks)
# [('High task', 1), ('Medium task', 2), ('Low task', 3)]

在特定元素前插入

def insert_before(lst, target, value):
    try:
        index = lst.index(target)
        lst.insert(index, value)
    except ValueError:
        pass  # 找不到 target

fruits = ["apple", "orange", "grape"]
insert_before(fruits, "orange", "banana")
print(fruits)  # ['apple', 'banana', 'orange', 'grape']

在特定元素後插入

def insert_after(lst, target, value):
    try:
        index = lst.index(target)
        lst.insert(index + 1, value)
    except ValueError:
        pass  # 找不到 target

fruits = ["apple", "orange", "grape"]
insert_after(fruits, "orange", "banana")
print(fruits)  # ['apple', 'orange', 'banana', 'grape']

時間複雜度

insert() 的時間複雜度是 O(n),因為需要移動插入位置之後的所有元素。

如果頻繁需要在開頭插入,考慮使用 collections.deque

from collections import deque

d = deque([1, 2, 3])
d.appendleft(0)  # O(1)
print(list(d))   # [0, 1, 2, 3]

常見錯誤

誤用回傳值

# 錯誤:insert() 回傳 None
numbers = [1, 2, 3].insert(0, 0)
print(numbers)  # None

# 正確
numbers = [1, 2, 3]
numbers.insert(0, 0)
print(numbers)  # [0, 1, 2, 3]