首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python List.index() 方法完整教學:尋找元素首次出現索引與例外處理

     編輯:更多程式設計知識

index() 是 Python 列表用於查找元素首次出現位置的方法,回傳該元素的索引(從 0 起算)。若元素不存在,會拋出 ValueError 例外,這是新手最常踩的坑。本文詳細說明語法、參數、回傳值、例外處理模式與進階搜尋技巧。

語法與參數

list.index(obj[, start[, end]])
  • obj:要查找的目標元素(透過 == 比較)
  • start(可選):起始搜尋索引,預設 0
  • end(可選):結束搜尋索引(不含),預設列表長度

回傳值與例外

  • 找到:回傳 整數索引(首次出現位置)
  • 未找到:拋出 ValueError: 'x' is not in list

基本範例

#!/usr/bin/python
aList = [123, 'xyz', 'zara', 'abc']
print("Index for xyz :", aList.index('xyz'))   # 1
print("Index for zara :", aList.index('zara')) # 2

# 指定搜尋範圍
lst = ['a', 'b', 'c', 'b', 'd']
print(lst.index('b', 2))      # 3(從索引 2 開始找)
print(lst.index('b', 0, 3))   # 1(索引 0 到 2 範圍內)

例外處理模式(必會技巧)

模式一:try/except 捕捉 ValueError(標準做法)


def safe_index(lst, value, default=-1):
    try:
        return lst.index(value)
    except ValueError:
        return default

lst = [1, 2, 3]
print(safe_index(lst, 2))   # 1
print(safe_index(lst, 99))  # -1(不拋出例外)

模式二:先用 in 檢查再查找(可讀性佳)


lst = [1, 2, 3]
value = 99

if value in lst:
    idx = lst.index(value)
    print(f"找到於索引 {idx}")
else:
    print("不存在")

模式三:使用 enumerate 手動搜尋(可自訂比較邏輯)


def find_index(lst, predicate):
    """依自訂條件函式尋找索引"""
    for i, x in enumerate(lst):
        if predicate(x):
            return i
    return -1

lst = [{'id':1}, {'id':2}, {'id':3}]
print(find_index(lst, lambda x: x['id'] == 2))  # 1

進階搜尋技巧

1. 尋找所有出現位置


def all_indices(lst, value):
    return [i for i, x in enumerate(lst) if x == value]

lst = ['a', 'b', 'c', 'b', 'd']
print(all_indices(lst, 'b'))  # [1, 3]

2. 從右向左搜尋(找最後一次出現)


# 方法一:反轉列表後搜尋
lst = ['a', 'b', 'c', 'b', 'd']
last_idx = len(lst) - 1 - lst[::-1].index('b')
print(last_idx)  # 3

# 方法二:rindex 不存在,手動實作
def rindex(lst, value):
    for i in range(len(lst)-1, -1, -1):
        if lst[i] == value:
            return i
    raise ValueError(f"{value} not in list")

3. 搭配切片進行區間搜尋


lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 只在索引 3 到 7 之間找 5
try:
    idx = lst.index(5, 3, 8)  # 找到索引 5
    print(idx)
except ValueError:
    print("區間內不存在")

效能特性

  • 時間複雜度:O(n),線性掃描
  • 空間複雜度:O(1)
  • 大量查找建議建立「值→索引」字典:{v:i for i,v in enumerate(lst)}(O(1) 查詢,但需額外記憶體且不支援重複值)

常見陷阱與注意事項


# 陷阱 1:不存在時拋出例外(最常見錯誤)
lst = [1, 2, 3]
lst.index(4)  # ValueError: 4 is not in list

# 陷阱 2:只回傳「第一個」匹配索引
lst = ['a', 'b', 'a', 'c']
print(lst.index('a'))  # 0,而非 [0, 2]

# 陷阱 3:start/end 參數為索引,非元素值
lst = [10, 20, 30, 40]
lst.index(30, 20)  # 錯誤!20 被視為 start 索引(超出範圍)
# 正確:
lst.index(30, 2)   # 從索引 2 開始找

# 陷阱 4:可變物件比較用 ==(內容相等即視為同一)
a = [1, 2]
lst = [a, [1, 2], [3, 4]]
print(lst.index([1, 2]))  # 0(找到第一個內容相等的)

index() vs 其他查找方法

方法用途回傳不存在時
list.index(x)找第一個索引intValueError
x in list檢查存在性boolFalse
list.count(x)統計出現次數int0
enumerate + 條件自訂邏輯找索引int/自訂自訂
dict 映射大量 O(1) 查詢intKeyError

總結

index() 是尋找列表元素首次出現索引的標準方法,語法為 list.index(obj, start, end)。核心注意點:不存在會拋出 ValueError,務必用 in 檢查或 try/except 處理。掌握區間搜尋、反向搜尋、全索引搜尋等進階技巧,並理解其 O(n) 特性,能在資料處理、演算法實作中靈活運用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved