Python index() - List 搜尋位置
index() 方法用來搜尋元素在 list 中的位置索引。
基本用法
fruits = ["apple", "banana", "orange"]
index = fruits.index("banana")
print(index) # 1
語法
list.index(element, start=0, end=len(list))
element:要搜尋的元素start:搜尋起始位置(選填)end:搜尋結束位置(選填)- 回傳:找到的第一個位置索引
- 例外:找不到時拋出 ValueError
元素不存在時會報錯
fruits = ["apple", "banana"]
# 會拋出 ValueError
# fruits.index("orange") # ValueError: 'orange' is not in list
# 安全的做法:先檢查
if "orange" in fruits:
index = fruits.index("orange")
else:
index = -1
# 或使用 try-except
try:
index = fruits.index("orange")
except ValueError:
index = -1
只回傳第一個符合的位置
numbers = [1, 2, 3, 2, 4, 2]
index = numbers.index(2)
print(index) # 1(第一個 2 的位置)
指定搜尋範圍
numbers = [1, 2, 3, 2, 4, 2]
# 從索引 2 開始搜尋
index = numbers.index(2, 2)
print(index) # 3
# 從索引 4 開始搜尋
index = numbers.index(2, 4)
print(index) # 5
# 在索引 0-3 範圍搜尋
index = numbers.index(2, 0, 4)
print(index) # 1
找出所有出現位置
numbers = [1, 2, 3, 2, 4, 2]
# 方法 1:使用迴圈
positions = []
for i, num in enumerate(numbers):
if num == 2:
positions.append(i)
print(positions) # [1, 3, 5]
# 方法 2:使用 list comprehension
positions = [i for i, num in enumerate(numbers) if num == 2]
print(positions) # [1, 3, 5]
實際範例
尋找並修改元素
fruits = ["apple", "banana", "orange"]
# 找到 banana 並修改
if "banana" in fruits:
index = fruits.index("banana")
fruits[index] = "grape"
print(fruits) # ['apple', 'grape', 'orange']
取得排名
scores = [85, 92, 78, 95, 88]
sorted_scores = sorted(scores, reverse=True)
for score in scores:
rank = sorted_scores.index(score) + 1
print(f"Score {score}: Rank {rank}")
輸出:
Score 85: Rank 4
Score 92: Rank 2
Score 78: Rank 5
Score 95: Rank 1
Score 88: Rank 3
在特定元素前後插入
def insert_before(lst, target, value):
try:
index = lst.index(target)
lst.insert(index, value)
except ValueError:
pass
def insert_after(lst, target, value):
try:
index = lst.index(target)
lst.insert(index + 1, value)
except ValueError:
pass
items = ["a", "b", "c"]
insert_before(items, "b", "x")
print(items) # ['a', 'x', 'b', 'c']
insert_after(items, "b", "y")
print(items) # ['a', 'x', 'b', 'y', 'c']
交換元素位置
def swap_elements(lst, elem1, elem2):
try:
i1 = lst.index(elem1)
i2 = lst.index(elem2)
lst[i1], lst[i2] = lst[i2], lst[i1]
except ValueError:
pass
items = ["a", "b", "c", "d"]
swap_elements(items, "b", "d")
print(items) # ['a', 'd', 'c', 'b']
安全的 index 函數
def safe_index(lst, value, default=-1):
try:
return lst.index(value)
except ValueError:
return default
numbers = [1, 2, 3, 4, 5]
print(safe_index(numbers, 3)) # 2
print(safe_index(numbers, 10)) # -1
index() vs enumerate()
numbers = [10, 20, 30, 40, 50]
# 使用 index()(需要先確認存在)
if 30 in numbers:
print(numbers.index(30)) # 2
# 使用 enumerate()(遍歷時同時取得索引)
for i, num in enumerate(numbers):
if num == 30:
print(i) # 2
break
時間複雜度
index() 的時間複雜度是 O(n),需要線性搜尋。
如果需要頻繁搜尋,考慮使用字典:
# 建立反向索引
fruits = ["apple", "banana", "orange"]
index_map = {fruit: i for i, fruit in enumerate(fruits)}
# O(1) 查詢
print(index_map.get("banana", -1)) # 1
print(index_map.get("grape", -1)) # -1