PYTHON 프로그래밍

본문 바로가기

사이트 내 전체검색


2. heapq

페이지 정보

작성자 관리자 댓글 0건 조회 4,514회 작성일 18-12-04 22:02

본문

 

컬렉션 내부에서 가장 크거나 작은 N개의 아이템을 찾으려고 한다.

heapq 모듈에 이 용도에 적합한 nlargest()와 nsmallest() 함수가 있다.


- heapq.nlargest(n, iterable, key=None)

- heapq.nsmallest(n, iterable, key=None)


import heapq

nums = [1, 8, 3, -5, 4, 99, -4, 0]


print(heapq.nlargest(3, nums))

print(heapq.nsmallest(3, nums))


그림입니다.
원본 그림의 이름: CLP00002a5c6438.bmp
원본 그림의 크기: 가로 405pixel, 세로 128pixel


좀 더 복잡한 구조에서는 키 파라미터에 람다를 전달해 가져올 수 있다.


import heapq

grades = [

    {'name': 'Steve', 'grade': 80},

    {'name': 'David', 'grade': 90},

    {'name': 'Tony', 'grade': 40},

    {'name': 'Grace', 'grade': 100}

]


print(heapq.nlargest(2, grades, lambda s: s['grade']))

print(heapq.nsmallest(2, grades, lambda s: s['grade']))


그림입니다.
원본 그림의 이름: CLP00002a5c0002.bmp
원본 그림의 크기: 가로 638pixel, 세로 123pixel


nlargest()와 nsmallest()는 N의 크기가 컬렉션의 크키보다 작은 경우에 유용하다. 실제로 위 함수는 아래처럼 데이터를 힙으로 정렬시켜 놓는 리스트로 변환한다.


import heapq

nums = [1, 8, 3, -5, 4, 99, -4, 0]

heap = list(nums)

heapq.heapify(heap)

print(heap) 


그림입니다.
원본 그림의 이름: CLP00002a5c0003.bmp
원본 그림의 크기: 가로 472pixel, 세로 106pixel


힙의 가장 중요한 기능을 heap[0]이 가장 작은 아이템이 된다는 사실이다.  가장 작은 아이템을 팝하고 그 다음 아이템으로 치환하는 heapq.heappop() 메서드를 사용하면, 뒤이어 나오는 아이템도 쉽게 찾을 수 있다.


print(heapq.heappop(heap)) 

print(heapq.heappop(heap)) 

print(heapq.heappop(heap)) 


그림입니다.
원본 그림의 이름: CLP00002a5c0004.bmp
원본 그림의 크기: 가로 405pixel, 세로 157pixel


만약 최대값이나 최소값을 찾는 경우라면(N = 1), min()이나 max()를 사용하는 것이 빠르다.


import heapq

nums = [1, 8, 3, -5, 4, 99, -4, 0]


print(min(nums)) #-> -5

print(max(nums)) #-> 99


그림입니다.
원본 그림의 이름: CLP000031e4699d.bmp
원본 그림의 크기: 가로 377pixel, 세로 113pixel


N의 크기가 컬렉션 크기와 비슷하다면, 컬렉션을 정렬해놓고 그 조각을 찾는 것이 더 빠르다.


import heapq

nums = [1, 8, 3, -5, 4, 99, -4, 0]


sorted_nums = sorted(nums)


print(sorted_nums[:3]) 

print(sorted_nums[-3:]) 


그림입니다.
원본 그림의 이름: CLP000031e40001.bmp
원본 그림의 크기: 가로 373pixel, 세로 111pixel


nlargest()의 결과와 정렬 순서가 다르다.

댓글목록

등록된 댓글이 없습니다.



개인정보취급방침 서비스이용약관
Copyright © www.leelab.co.kr All rights reserved.
상단으로
TEL. 063-469-4551 FAX. 063-469-4560
전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과
PC 버전으로 보기