본문 바로가기

PYTHON

[Python] bisect_left, bisect_right

bisect

 

이거 없어도 괜찮을 거 같다는 고집이 있었기 때문에 따로 사용하고 있지는 않았는데, 생각보다 편리한 거 같다. 새로운 것에 대한 거부감을 줄이자.

 

bisect_left, bisect_right는 bisect 라이브러리에서 요긴하게 쓰이는 함수로, 시간복잡도는 O(logN)이라고 한다. 이 함수는 이진탐색을 통해 리스트에서 원하는 값의 인덱스를 찾아준다고 한다. 아래 코드를 통해서 이해해보자.

 

from bisect import bisect_left, bisect_right # bisect 라이브러리에서 가져온다

list = [1,1,1,1,1,2,3,4,5,6,6,6,8,9,9,9] # 반복되는 수가 있는 정렬된 리스트
list_2 = [42,5,6,8,1,57,98,4] # 무작위로 있는 리스트

print(bisect_left(list,1)) # 0, 왼쪽에 처음 나오는 위치
print(bisect_right(list,1)) # 5, 오른쪽에 처음 나오는 위치 
print(bisect_left(list_2,42)) # 5 # 왼쪽에 처음 나오는 위치, 정렬된 리스트 기준으로 알려준다.
print(sorted(list_2)) # [1, 4, 5, 6, 8, 42, 57, 98]

 

bisect_right, bisect_left는 이진탐색을 통해 찾고자 하는 값이 리스트에서 오른쪽에서 처음나오는 위치, 왼쪽에서 처음 나오는 위치를 알려준다. 특정 범위에 속하는 원소의 개수를 구하고자 할 때, count를 이용하면 효율이 떨어지는 경우에 사용하면 용이할 듯하다.

 

# bisect_left, bisect_right 함수 사용법
bisect_left(arr, value, lo, hi)
bisect_right(arr, value, lo, hi)

 

arr : 배열

value: 찾고자 하는 값

lo: 배열의 시작 범위

hi: 배열의 끝 범위

 

해당 값이 리스트에 있을 때

 

bisect_left: 해당 값이 있는 인덱스를 반환한다.

bisect_right: 해당 값이 있는 인덱스 + 1을 반환한다.

 

해당값이 리스트에 없을 때

 

bisect_left: 리스트 오름차순에 들어갈 인덱스 반환

bisect_right: 리스트 오름차순에 들어갈 인덱스 반환

'PYTHON' 카테고리의 다른 글

[Python] split()과 split(" ")의 차이  (0) 2024.03.12
[Python] Dict는 삽입 순서를 보장해준다.  (0) 2024.02.21
[Python] return  (0) 2023.09.08
[Python] None  (0) 2023.09.08
[Python] 진수 변환기 만들기  (0) 2023.07.11