2014-03-01 1 views

답변

7

사용할 수를 heapq.nsmallest : 당신의 목록이 긴 경우

>>> from heapq import nsmallest 
>>> in_list = [1, 2, 3, 4, 5, 6] 
>>> nsmallest(3, in_list) 
[1, 2, 3] 
>>> 
1

,이 일을 가장 효율적인 방법은 numpy.partition를 통해입니다 :

>>> def lowest(a, n): return numpy.partition(a, n-1)[:n] 
>>> in_list = [6, 4, 3, 2, 5, 1] 
>>> lowest(in_list, 3) 
array([1, 2, 3]) 

O (NlogN) 시간에 작동하는 전체 정렬과 달리 O (N) 시간에 실행됩니다. 시간 절약은 전체 정렬을 수행하지 않아 발생하지만 최소 요소가 가장 낮은 요소 인 것을 보장하는 데 필요한 최소량 만 필요합니다. 따라서 출력이 반드시 정렬되지는 않습니다.

정렬해야하는 경우 나중에 처리 할 수 ​​있습니다 (numpy.sort(lowest(in_list,3)) => array([1,2,3])). 큰 배열의 경우 이것은 전체를 먼저 정렬하는 것보다 더 빠릅니다.

편집 : 여기 numpy.partition, heapq.nsmallestsorted의 속도를 비교 :

>>> a = numpy.random.permutation(np.arange(1000000)) 
>>> timeit numpy.partition(a, 2)[:3] 
100 loops, best of 3: 3.32 ms per loop 
>>> timeit heapq.nsmallest(3,a) 
1 loops, best of 3: 220 ms per loop 
>>> timeit sorted(a)[:3] 
1 loops, best of 3: 1.18 s per loop 

그래서 numpy.partition 66 배 빠른 heapq.nsmallest보다 백만 요소와 배열되고, 그것은 355 배 빠른보다 sorted. 이것은 heapq.nsmallest (매우 유연함)을 절대로 사용해서는 안된다는 의미는 아니지만 속도가 중요 할 때 일반 목록을 피하는 것이 얼마나 중요한지를 보여줍니다.

+0

이것은 원래 목록을'np.array()'객체로 변환합니다. –

+0

'heapq.nsmallest()'는 똑같은 일을합니다. O (NlogK) 시간이 소요되며, 여기서 K는 리턴 될 요소의 수입니다. 'numpy.partition()'과'heapq'는 모두 C 코드에 의해 뒷받침됩니다. 'heapq'가 파이썬리스트를 반환한다는 사실은'numpy.partition()'보다 이점으로 볼 수 있습니다. –

+0

예. 그러나 목록이 길면 목록보다 배열을 사용하고 싶습니다. 목록이 너무 빨라 훨씬 적은 메모리를 사용하기 때문입니다. 출력을 일반 목록으로 만들려면'list (lowest (in_list, 3))'를 수행하십시오. – amaurea

3

당신 정렬 할 수 있다면, 당신은 다음과 같이 3 개 요소 frst 얻을 수 있습니다 :

alist=[6, 4, 3, 2, 5, 1] 
sorted(alist)[:3] 

출력 : 수입 모듈이없는

[1,2,3] 
1

더 간단 :

l =[3,8,9,10,2,4,1] 
l1 = sorted(l)[:3] 

희망이 도움이

관련 문제