겉바속촉
[PYTHON] 파이썬 _가장 작은 두 값 찾기 본문
728x90
반응형
안녕하세요
겉바속촉입니다
!^^!
!!파이썬 시작하기!!
이번에는
가장 작은 두 값을
여러가지 방법들로 도출시켜볼게요
그리고
그 방법들 중에서 어떤 것이 제일 좋은지도
알아볼게요
가장 작은 두 값 찾기
가장 작은 값은 우리가 찾기 쉬운데
두 개를 찾는 것이 목표입니다
어떻게 하면 될까요???
가장 작은 값과 인덱스 에 대해서 생각해봅시다 ^_____^
방법1) 찾고 삭제하고 찾기
from typing import List, Tuple
# 방법1. 찾고 삭제하고 찾기
def method_1(L: List[float]) -> Tuple[int,int]:
# L에서 가장 작은 항목을 구한다
smallest = min(L)
# 가장 작은 항목의 인덱스를 구한다.
min1 = L.index(smallest)
# 리스트에서 그 항목을 삭제한다
L.remove(smallest)
# 리스트에서 다음으로 가장 작은 항목의 인덱스를 구한다.
next_smallest = min(L)
# 두번째 가장 작은 수의 인덱스
min2 = L.index(next_smallest)
# 가장 작은 항목을 리스트에 다시 넣는다.
L.insert(min1, smallest)
# 필요에 따라 두 번째 인덱스를 조정한다.
if min1 <= min2:
min2 += 1
# 두 인덱스를 반환한다.
return (min1, min2)
items = [809, 834, 477, 478, 307, 122, 96, 102, 324, 476]
result = method_1(items)
print(result)
결과
방법2) 정렬해서 최솟값을 찾은 후 인덱스 구하기
from typing import List, Tuple
# 방법2. 정렬해서 최소값을 찾은 후 인덱스 구하기
def method_2(L: List[float]) -> Tuple[int,int]:
# L의 복사본을 정렬한다
sorted_list = sorted(L)
# 가장 작은 두 수를 구한다
smallest = sorted_list[0]
next_smallest = sorted_list[1]
# 원래 리스트 L에서 두 수의 인덱스를 구한다.
min1 = L.index(smallest)
min2 = L.index(next_smallest)
# 두 인덱스를 반환한다
return (min1, min2)
items = [809, 834, 477, 478, 307, 122, 96, 102, 324, 476]
result = method_2(items)
print(result)
방법3) 리스트 전체 훑기
from typing import List, Tuple
# 방법3. 리스트 전체 훑기
def method_3(L: List[float]) -> Tuple[int,int]:
# L의 맨 앞부분에서 가장 작은 값과 두 번째로 작은 값의 인덱스를 min1과 min2에 할당한다
if L[0] < L[1]:
min1, min2 = 0, 1
else:
min1, min2 = 1, 0
# 리스트 내 각 값을 순서대로 확인한다.
# 더 작은 값을 찾으면 인덱스를 업데이트 한다.
for i in range(2, len(L)):
if L[i] < L[min1]:
min1, min2 = i, min1
elif L[i] < L[min2]:
min2 = i
# 두 인덱스를 반환한다.
return (min1, min2)
items = [809, 834, 477, 478, 307, 122, 96, 102, 324, 476]
result = method_3(items)
print(result)
그렇다면 방법 3가지 중에서 무엇이 제일 효율적일까요??
함수 시간을 측정해주는 것입니다:)
함수의 실행 시간을 반환하는 함수를 만들어줄게요!!
def func_runtime(find_func: Callable[[List[float]], Any], lst: List[float]) -> float:
t1 = time.perf_counter()
find_func(lst)
t2 = time.perf_counter()
return (t2 - t1) * 1000.0
그래서 위의 방법 3가지를 함께 넣고 import 추가해주세요:)
from typing import List, Tuple, Any, Callable
import time
# 방법1. 찾고 삭제하고 찾기
def method_1(L: List[float]) -> Tuple[int,int]:
# L에서 가장 작은 항목을 구한다
smallest = min(L)
# 가장 작은 항목의 인덱스를 구한다.
min1 = L.index(smallest)
# 리스트에서 그 항목을 삭제한다
L.remove(smallest)
# 리스트에서 다음으로 가장 작은 항목의 인덱스를 구한다.
next_smallest = min(L)
# 두번째 가장 작은 수의 인덱스
min2 = L.index(next_smallest)
# 가장 작은 항목을 리스트에 다시 넣는다.
L.insert(min1, smallest)
# 필요에 따라 두 번째 인덱스를 조정한다.
if min1 <= min2:
min2 += 1
# 두 인덱스를 반환한다.
return (min1, min2)
# items = [809, 834, 477, 478, 307, 122, 96, 102, 324, 476]
# result = method_1(items)
# print(result)
# 방법2. 정렬해서 최소값을 찾은 후 인덱스 구하기
def method_2(L: List[float]) -> Tuple[int,int]:
# L의 복사본을 정렬한다
sorted_list = sorted(L)
# 가장 작은 두 수를 구한다
smallest = sorted_list[0]
next_smallest = sorted_list[1]
# 원래 리스트 L에서 두 수의 인덱스를 구한다.
min1 = L.index(smallest)
min2 = L.index(next_smallest)
# 두 인덱스를 반환한다
return (min1, min2)
# items = [809, 834, 477, 478, 307, 122, 96, 102, 324, 476]
# result = method_2(items)
# print(result)
# 방법3. 리스트 전체 훑기
def method_3(L: List[float]) -> Tuple[int,int]:
# L의 맨 앞부분에서 가장 작은 값과 두 번째로 작은 값의 인덱스를 min1과 min2에 할당한다
if L[0] < L[1]:
min1, min2 = 0, 1
else:
min1, min2 = 1, 0
# 리스트 내 각 값을 순서대로 확인한다.
# 더 작은 값을 찾으면 인덱스를 업데이트 한다.
for i in range(2, len(L)):
if L[i] < L[min1]:
min1, min2 = i, min1
elif L[i] < L[min2]:
min2 = i
# 두 인덱스를 반환한다.
return (min1, min2)
# 함수의 실행 시간을 반환하는 함수
def func_runtime(find_func: Callable[[List[float]], Any], lst: List[float]) -> float:
t1 = time.perf_counter()
find_func(lst)
t2 = time.perf_counter()
return (t2 - t1) * 1000.0
items = [809, 834, 477, 478, 307, 122, 96, 102, 324, 476]
t1 = func_runtime(method_1, items)
t2 = func_runtime(method_2, items)
t3 = func_runtime(method_3, items)
print(t1)
print(t2)
print(t3)
그럼 결과를 계속 실행시켜보면 시간이 모두 다른데
방법 2가 가장 빠른 걸 알 수 있죠!!
728x90
반응형
'IT 일기 (상반기) > PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬_이진검색, 검색시간비교 (0) | 2021.01.07 |
---|---|
[PYTHON] 파이썬_리스트 검색 (0) | 2021.01.07 |
[PYTHON] 파이썬_정규식 & re 활용 (0) | 2021.01.06 |
[PYTHON] 파이썬_실습 (0) | 2021.01.06 |
[PYTHON] 파이썬_StringIO, 파일 읽기 방법 활용 (0) | 2021.01.05 |