Tôi mới sử dụng python và không thể hiểu được sự khác biệt giữa tìm và chỉ mục.
>>> line
'hi, this is ABC oh my god!!'
>>> line.find("o")
16
>>> line.index("o")
16
Chúng luôn trả về cùng một kết quả. Cảm ơn!!
Câu trả lời:
str.find
trả về -1
khi nó không tìm thấy chuỗi con.
>>> line = 'hi, this is ABC oh my god!!'
>>> line.find('?')
-1
Trong khi str.index
tăng ValueError
:
>>> line.index('?')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
Cả hai hàm đều hoạt động theo cùng một cách nếu tìm thấy một chuỗi con.
index
tài liệu tôi đã liên kết trong câu trả lời: Giống như find (), nhưng tăng ValueError khi không tìm thấy chuỗi con.
index
để trả lại -1
và find
trả lại ValueError
trong trường hợp sub
không tìm thấy.
Cũng tìm thấy chỉ có sẵn cho các chuỗi khi chỉ mục có sẵn cho danh sách, bộ dữ liệu và chuỗi
>>> somelist
['Ok', "let's", 'try', 'this', 'out']
>>> type(somelist)
<class 'list'>
>>> somelist.index("try")
2
>>> somelist.find("try")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'find'
>>> sometuple
('Ok', "let's", 'try', 'this', 'out')
>>> type(sometuple)
<class 'tuple'>
>>> sometuple.index("try")
2
>>> sometuple.find("try")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'find'
>>> somelist2
"Ok let's try this"
>>> type(somelist2)
<class 'str'>
>>> somelist2.index("try")
9
>>> somelist2.find("try")
9
>>> somelist2.find("t")
5
>>> somelist2.index("t")
5
@falsetru đã cung cấp lời giải thích về sự khác biệt giữa các chức năng, tôi đã thực hiện kiểm tra hiệu suất giữa chúng.
"""Performance tests of 'find' and 'index' functions.
Results:
using_index t = 0.0259 sec
using_index t = 0.0290 sec
using_index t = 0.6851 sec
using_find t = 0.0301 sec
using_find t = 0.0282 sec
using_find t = 0.6875 sec
Summary:
Both (find and index) functions have the same performance.
"""
def using_index(text: str, find: str) -> str:
"""Returns index position if found otherwise raises ValueError."""
return text.index(find)
def using_find(text: str, find: str) -> str:
"""Returns index position if found otherwise -1."""
return text.find(find)
if __name__ == "__main__":
from timeit import timeit
texts = [
"short text to search" * 10,
"long text to search" * 10000,
"long_text_with_find_at_the_end" * 10000 + " to long",
]
for f in [using_index, using_find]:
for text in texts:
t = timeit(stmt="f(text, ' ')", number=10000, globals=globals())
print(f"{f.__name__} {t = :.4f} sec")
print()