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]