반응형
<질문>
나는 파이썬을 처음 사용하고 찾기와 색인의 차이점을 잘 이해할 수 없습니다.
>>> line
'hi, this is ABC oh my god!!'
>>> line.find("o")
16
>>> line.index("o")
16
그들은 항상 같은 결과를 반환합니다. 감사!!
<답변1>
str.find
보고-1
부분 문자열을 찾지 못한 경우.
>>> line = 'hi, this is ABC oh my god!!'
>>> line.find('?')
-1
하는 동안str.index
인상ValueError
:
>>> line.index('?')
Traceback (most recent call last):
File "", line 1, in
ValueError: substring not found
하위 문자열이 발견되면 두 함수 모두 동일한 방식으로 작동합니다.
<답변2>
또한 찾기는 목록, 튜플 및 문자열에 인덱스를 사용할 수 있는 문자열에만 사용할 수 있습니다.
>>> somelist
['Ok', "let's", 'try', 'this', 'out']
>>> type(somelist)
<class 'list'>
>>> somelist.index("try")
2
>>> somelist.find("try")
Traceback (most recent call last):
File "", line 1, in
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 "", line 1, in
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
<답변3>
@falsetru는 기능의 차이점에 대해 설명을 제공했고, 나는 그들 사이의 성능 테스트를 했습니다.
"""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()
반응형
'개발 > Python' 카테고리의 다른 글
[파이썬] 유니코드 정규화 (0) | 2022.10.09 |
---|---|
[파이썬] POST를 사용한 Flask 예제 (0) | 2022.10.09 |
[파이썬] 클래스 개체에서 새 인스턴스를 만드는 방법 (0) | 2022.10.09 |
[파이썬] 공유메모리의 멀티 프로세싱 (0) | 2022.10.09 |