다른 목록에있는 가장 낮은 값 3 개를 어떻게 반환합니까? 예를 들어 나는이 목록의 3 개 가장 낮은 값을 얻으려면 :다른 목록에있는 가장 낮은 값 3 개 목록을 반환하는 방법
이in_list = [1, 2, 3, 4, 5, 6]
input: function(in_list, 3)
output: [1, 2, 3]
다른 목록에있는 가장 낮은 값 3 개를 어떻게 반환합니까? 예를 들어 나는이 목록의 3 개 가장 낮은 값을 얻으려면 :다른 목록에있는 가장 낮은 값 3 개 목록을 반환하는 방법
이in_list = [1, 2, 3, 4, 5, 6]
input: function(in_list, 3)
output: [1, 2, 3]
사용할 수를 heapq.nsmallest
: 당신의 목록이 긴 경우
>>> from heapq import nsmallest
>>> in_list = [1, 2, 3, 4, 5, 6]
>>> nsmallest(3, in_list)
[1, 2, 3]
>>>
,이 일을 가장 효율적인 방법은 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.nsmallest
및 sorted
의 속도를 비교 :
>>> 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
(매우 유연함)을 절대로 사용해서는 안된다는 의미는 아니지만 속도가 중요 할 때 일반 목록을 피하는 것이 얼마나 중요한지를 보여줍니다.
이것은 원래 목록을'np.array()'객체로 변환합니다. –
'heapq.nsmallest()'는 똑같은 일을합니다. O (NlogK) 시간이 소요되며, 여기서 K는 리턴 될 요소의 수입니다. 'numpy.partition()'과'heapq'는 모두 C 코드에 의해 뒷받침됩니다. 'heapq'가 파이썬리스트를 반환한다는 사실은'numpy.partition()'보다 이점으로 볼 수 있습니다. –
예. 그러나 목록이 길면 목록보다 배열을 사용하고 싶습니다. 목록이 너무 빨라 훨씬 적은 메모리를 사용하기 때문입니다. 출력을 일반 목록으로 만들려면'list (lowest (in_list, 3))'를 수행하십시오. – amaurea
당신 정렬 할 수 있다면, 당신은 다음과 같이 3 개 요소 frst 얻을 수 있습니다 :
이alist=[6, 4, 3, 2, 5, 1]
sorted(alist)[:3]
출력 : 수입 모듈이없는
[1,2,3]
더 간단 :
l =[3,8,9,10,2,4,1]
l1 = sorted(l)[:3]
희망이 도움이
많은 수 있습니다. ys. 어떤 접근 방식을 생각해 냈습니까? – devnull