sự khác biệt giữa tìm kiếm và chỉ mục


77

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:


106

str.findtrả về -1khi nó không tìm thấy chuỗi con.

>>> line = 'hi, this is ABC oh my god!!'
>>> line.find('?')
-1

Trong khi str.indextă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.


1
và nếu một chuỗi con được tìm thấy, cả hai hàm đều hoạt động theo cùng một cách?
SohamC

@ user1603970, Đúng vậy. Các thông số của chúng cũng giống nhau.
falsetru

@ user1603970, Theo indextà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.
falsetru

như @reep đề cập, tìm chỉ có sẵn cho các chuỗi nơi như chỉ số có sẵn cho các danh sách, các bộ và chuỗi
raja777m

1
python nên bỏ một trong hai phương pháp này. Một trong số họ phục vụ tốt mục đích. Ngoài ra, tôi nghĩ rằng nó thích hợp hơn indexđể trả lại -1find trả lại ValueErrortrong trường hợp subkhông tìm thấy.
pouya

23

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

2

@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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.