Courses
Trong Python, một cấu trúc dữ liệu giúp bạn tổ chức và lưu trữ dữ liệu hiệu quả. Một cấu trúc phổ biến và linh hoạt là list (danh sách), có thể chứa nhiều kiểu dữ liệu theo một thứ tự xác định. Python cũng cung cấp nhiều hàm hoặc phương thức để làm việc với danh sách.
Trong hướng dẫn này, bạn sẽ tìm hiểu về hàm index() của Python. Phương thức index() sẽ tìm kiếm một phần tử trong danh sách và trả về vị trí/chỉ số của nó. Trước hết, hướng dẫn sẽ giới thiệu về danh sách, sau đó bạn sẽ xem một số ví dụ đơn giản về cách làm việc với hàm index().
Để tự mình chạy toàn bộ mã ví dụ trong hướng dẫn này một cách dễ dàng, bạn có thể tạo một sổ tay DataLab miễn phí đã cài sẵn Python và chứa tất cả các đoạn mã mẫu.
Indexing trong Python là gì?
Trong Python, indexing (đánh chỉ số) là quá trình truy cập một phần tử cụ thể trong một dãy (sequence), chẳng hạn như chuỗi (string) hoặc danh sách (list), bằng cách sử dụng vị trí hay số chỉ mục của nó. Indexing trong Python bắt đầu từ 0, nghĩa là phần tử đầu tiên có chỉ số 0, phần tử thứ hai có chỉ số 1, v.v. Ví dụ, nếu có chuỗi "Hello", ta có thể truy cập chữ cái đầu tiên "H" bằng chỉ số 0 với cú pháp dấu ngoặc vuông: string[0].
Hàm dựng sẵn index() của Python là một công cụ hữu ích để tìm chỉ số của một phần tử cụ thể trong một dãy. Hàm này nhận một đối số là giá trị cần tìm và trả về chỉ số của lần xuất hiện đầu tiên của giá trị đó trong dãy.
Nếu giá trị không được tìm thấy trong dãy, hàm sẽ phát sinh ValueError. Ví dụ, với danh sách [1, 2, 3, 4, 5], ta có thể tìm chỉ số của giá trị 3 bằng cách gọi list.index(3), kết quả sẽ trả về 2 (vì 3 là phần tử thứ ba trong danh sách, và chỉ số bắt đầu từ 0).
Hàm index() là một công cụ mạnh trong Python vì nó đơn giản hóa quá trình tìm chỉ số của một phần tử trong dãy, loại bỏ nhu cầu viết vòng lặp hay câu lệnh điều kiện. Hàm này đặc biệt hữu ích khi làm việc với tập dữ liệu lớn hoặc cấu trúc phức tạp, nơi việc tìm kiếm thủ công có thể tốn thời gian và dễ sai sót.
Hàm index() là gì?
Phương thức index() trả về chỉ số nhỏ nhất trong danh sách nơi phần tử cần tìm xuất hiện.
Hãy thử nhé:
list_numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
element = 3
print(list_numbers.index(element)) # 2
Nếu tìm một phần tử không tồn tại, nó sẽ phát sinh ValueError.
list_numbers = [4, 5, 6, 7, 8, 9, 10]
element = 3 # Not in the list
print(list_numbers.index(element)) # Throws a ValueError
Làm việc với chuỗi
Hãy thử với các phần tử kiểu chuỗi:
list_numbers = [1, 'two', 3, 4, 5, 6, 7, 8, 9, 10]
element = 'two'
print(list_numbers.index(element)) # 1
Lưu ý: Khi tìm kiếm chuỗi, index() phân biệt chữ hoa/thường. Ví dụ, 'Hello'.index('h') sẽ phát sinh ValueError.
Tìm lần xuất hiện đầu tiên
Giả sử bạn có nhiều hơn một lần xuất hiện của một phần tử, thì index() sẽ trả về vị trí đầu tiên nơi phần tử đó xuất hiện.
list_numbers = [3, 1, 2, 3, 3, 4, 5, 6, 3, 7, 8, 9, 10]
element = 3
print(list_numbers.index(element)) # 0
Vị trí trả về là 0, vì 3 xuất hiện lần đầu ở vị trí thứ nhất, tức chỉ số 0 trong Python.
Bên trong, cơ chế hoạt động như sau: phương thức duyệt qua tất cả các giá trị bắt đầu từ vị trí đầu tiên (chỉ số 0), tìm phần tử bạn đang tìm kiếm. Khi thấy giá trị phù hợp, nó trả về vị trí và kết thúc. Tuy nhiên, cách này không quá hiệu quả khi duyệt một danh sách lớn mà bạn cần vị trí của phần tử nằm về cuối danh sách.
Sử dụng tham số start và stop
list_numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
element = 7
print(list_numbers.index(element, 5, 8)) # 6
Cú pháp là: list_name.index(element, start, stop).
Ở đây các giá trị start và stop là tùy chọn. Thực tế, chỉ dùng khi bạn chắc chắn về phạm vi; nếu không, bạn sẽ gặp ValueError, như bên dưới.
list_numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
element = 7
print(list_numbers.index(element, 1, 5)) # Throws a ValueError
Tìm tất cả các lần xuất hiện
Vì index() chỉ trả về lần khớp đầu tiên, bạn có thể dùng list comprehension hoặc generator expression nếu cần vị trí của nhiều lần khớp trong danh sách. Cách làm như sau:
list_numbers = [3, 1, 2, 3, 3, 4, 5, 6, 3, 7, 8, 9, 10]
# List comprehension
print([i for i, n in enumerate(list_numbers) if n == 3]) # [0, 3, 4, 8]
list_numbers = [3, 1, 2, 3, 3, 4, 5, 6, 3, 7, 8, 9, 10]
g = (i for i, n in enumerate(list_numbers) if n == 3) # Generator expression
print("Generators store values, the first value here is:", next(g), ". Then the next is:", next(g), "followed by ", next(g),"and finally ", next(g))
# Generators store values, the first value here is: 0. Then the next is: 3 followed by 4 and finally 8
Generator tiết kiệm bộ nhớ vì tạo giá trị lần lượt theo nhu cầu thay vì lưu tất cả kết quả như list comprehension.
Tổng kết
Chúc mừng bạn vừa tìm hiểu về hàm index() trong Python! Bạn đã thấy cách nó giúp làm việc với danh sách. Bạn cũng đã được giới thiệu một số khái niệm mới. Để tìm hiểu thêm về list comprehension, hãy xem hướng dẫn Python List Comprehension của DataCamp. Hướng dẫn Python Iterator của DataCamp có thêm nội dung về generator và generator expression.
Tôi đã làm việc trong nhiều ngành và đảm nhiệm nhiều vai trò: nhà phát triển phần mềm, nhà nghiên cứu học máy, nhà khoa học dữ liệu, quản lý sản phẩm. Nhưng cốt lõi của tất cả, tôi là một lập trình viên yêu thích học hỏi và chia sẻ kiến thức!
Câu hỏi thường gặp
Điều gì xảy ra nếu có nhiều giá trị khớp với phần tử tôi đang tìm?
Phương thức index() chỉ trả về chỉ số của lần xuất hiện đầu tiên của phần tử khớp. Nếu bạn cần tất cả vị trí, hãy dùng list comprehension với enumerate().
Tôi có thể dùng index() với tuple hoặc string không?
Có! Phương thức index() hoạt động với mọi kiểu sequence, bao gồm tuple và string:
my_tuple = (1, 2, 3, 2)
print(my_tuple.index(2)) # Output: 1
text = "hello world"
print(text.index('o')) # Output: 4Có cách nào xử lý ValueError một cách an toàn không?
Có, hãy bao bọc lời gọi index() trong khối try...except để tránh chương trình bị dừng nếu không tìm thấy phần tử:
my_list = [1, 2, 3]
try:
print(my_list.index(4))
except ValueError:
print("Element not found.")
Làm sao để tìm từ cuối danh sách lên?
Phương thức index() không hỗ trợ tìm ngược. Để tìm lần xuất hiện cuối cùng, hãy đảo ngược danh sách thủ công hoặc dùng một comprehension:
my_list = [1, 2, 3, 2, 1]
last_index = len(my_list) - 1 - my_list[::-1].index(2)
print(last_index) # Output: 3
index() khác gì find()?
Phương thức find() dùng với chuỗi và trả về -1 thay vì phát sinh lỗi khi không tìm thấy giá trị. Danh sách không có phương thức find().
text = "hello"
print(text.find('e')) # Output: 1
print(text.find('z')) # Output: -1
Tôi có thể dùng index() với danh sách lồng nhau không?
Có, nhưng chỉ ở cấp cao nhất. index() không tìm bên trong các cấu trúc lồng nhau.
nested_list = [[1, 2], [3, 4]]
print(nested_list.index([3, 4])) # Output: 1
# This won't work: nested_list.index(3)
"list index out of range" là lỗi gì?
Lỗi "list index out of range" xảy ra khi bạn cố truy cập một chỉ số nằm ngoài phạm vi chỉ số hợp lệ của danh sách. Ví dụ, nếu một danh sách có 5 phần tử, các chỉ số hợp lệ là từ 0 đến 4. Nếu bạn cố truy cập chỉ số lớn hơn hoặc bằng 5, bạn sẽ gặp lỗi này.
Để tránh lỗi "list index out of range", bạn cần đảm bảo chỉ số muốn truy cập nằm trong phạm vi hợp lệ của danh sách. Bạn có thể dùng hàm len() để lấy độ dài danh sách và kiểm tra xem một chỉ số có nằm trong phạm vi hợp lệ hay không.
"list indices must be integers" là lỗi gì?
Lỗi "list indices must be integers" xảy ra khi bạn cố dùng một giá trị không phải số nguyên làm chỉ số danh sách. Ví dụ, nếu bạn dùng số thực hoặc chuỗi làm chỉ số danh sách, bạn sẽ gặp lỗi này.
Để tránh lỗi "list indices must be integers", bạn cần đảm bảo đang dùng một giá trị số nguyên làm chỉ số danh sách. Nếu cần dùng một giá trị không phải số nguyên làm chỉ số, bạn có thể chuyển nó thành số nguyên bằng hàm int().
