2014-04-11 6 views
1

리스트를 대략 동일한 응답 값을 갖는 k 개의 서브리스트로 나누고 싶습니다.목록을 거의 동일한 값을 갖는 k 개의 하위 목록으로 나누는 방법은 무엇입니까?

나는 형태의 목록이 :

L = [[1,2,3,2], [4,5,2,2], [2,3,9,1], [5,7,2,1], [2,3,3,1]] 

응답 값은 각 하위리스트의 마지막 요소입니다. 여기서, 상기 응답 값의 범위를 갖는다 [1,2]

K = 2, 그 다음 약 동일한 응답을 갖는 두 개의 하위 목록은 A 및 B : 마음에 제공된

A = [[1,2,3,2], [2,3,3,1]     # it has response values 1,2 
B = [[2,3,9,1], [4,5,2,2], [5,7,2,1]]  # it has response values 1,2,1 

유일 어떻게 든 정렬을 사용하는 것이 었습니다. 그러나, 그것을하는 비단식 방법이있을 수 있습니다. 리스트 L은 매우 길기 때문에 10000이라고 할 수 있습니다. 효율적인 방법을 기대합니다.

+0

* 정렬 알고리즘이 잘못 되었습니까? 어쩌면 우리에게 보여줄 수 있습니다. – wwii

+0

여기'k' 란 무엇입니까? – thefourtheye

+0

@thefourtheye k는 목록 L을 나눔으로써 형성해야하는 하위 목록의 수입니다. –

답변

0

당신이 설명하는 방법은 참으로 가장 pythonic/efficient 중 하나입니다.

def divideintokapprox(mylist, k): 
    sortedlist = sorted(mylist, key=lambda x: -x[-1]) 
    return [sortedlist[i::k] for i in range(k)] 

사용 예 :

L = [[1,2,3,2], [4,5,2,2], [2,3,9,1], [5,7,2,1], [2,3,3,1]] 

sublists = divideintokapprox(L, 2) 
print(sublists[0]) 
#[[1, 2, 3, 2], [2, 3, 9, 1], [2, 3, 3, 1]] 
print(sublists[1]) 
#[[4, 5, 2, 2], [5, 7, 2, 1]] 
0

내가 정말 영업 이익이 원하는 것을 이해하지 정렬 한 후 응답 값에 의해 및 목록 요소 번째 모든 k '을 얻어서 하위 목록으로 정렬 된 목록을 분할 하지만 느린 원자 기계에서는 목록이 100,000 개 (, 즉 100,000 개의 하위 목록) 인 목록을 정렬하는 데 230 밀리 초 밖에 걸리지 않습니다. 나는 OP가 그것이 "효율적"이라고 생각하기를 바란다.

>>> x = [ [ random.randrange(100) for _ in xrange(random.randrange(1, 1000)) ] for _ in xrange(10**5) ] 

>>> import time 
>>> a=time.time(); x.sort(key=lambda sl: sl[-1]); b=time.time() 
>>> 1e3*(b-a) 
226.77206993103027 

$ python -V 
Python 2.7.8 
$ head -10 /proc/cpuinfo 
processor  : 0 
vendor_id  : GenuineIntel 
cpu family  : 6 
model   : 28 
model name  : Intel(R) Atom(TM) CPU D510 @ 1.66GHz 
stepping  : 10 
microcode  : 0x107 
cpu MHz   : 1662.623 
cache size  : 512 KB 
physical id  : 0