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