2017-09-20 6 views
2

목록 목록이 있습니다. 각 목록은 개체 목록입니다. 작업은 길이가 내림차순으로 상위 n 개의 하위 목록을 반환하는 것입니다.Python : 최대 길이를 갖는 부속 목록에서 상위 n 개의 목록을 반환하십시오.

그림 :

[[{},{},{},{}],[{},{},{}],[{},{}],[{}],[]]

위에서, 나는이 하위 목록이 최대 길이 (3)를 가지고

[[{},{},{},{}],[{},{},{}],[{},{}]]

인 길이에 따라 상위 3 개 하위 목록의 목록을 반환 할 , 2,1 목록에 각각.

답변

4

,의 말을하자

sorted(l, key=len, reverse=True)[:3] 

을 또는 당신이 당신의 원본 목록을 정렬 할 수 있으며, 첫 번째 3 가지 요소를 사용합니다.

l.sort(key=len, reverse=True) 
l[:3] 

성능 측면에서 두 번째 옵션 더 빠른 것 같습니다 :

In [1]: %timeit sorted(l, key=len, reverse=True)[:3] 
1.9 µs ± 28.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) 

In [2]: %%timeit 
    ...: l.sort(key=len, reverse=True) 
    ...: l[:3] 
    ...: 
1.22 µs ± 33.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) 
+0

여기서 작업은 목록을 반환하는 것입니다 (질문에서 수정하지 않음). 그래서'''''''''''''''''''''''''''''''''''스위트' – Siddharth

+0

@Siddharth, 나는 동의한다. 그러나 그것은 목록을 수정하는 성능면에서 새로운 목록의 복사본을 만드는 것보다 빠르다고 보인다. – lmiguelvargasf

+0

@ lmiguelvargasf 님이 @Siddharth와 동일한 답변을 upvoted했습니다. – Siddharth

2
>>> a = [[{},{},{},{}],[{},{},{}],[{},{}],[{}],[]] 
>>> sorted(a, key=len, reverse=True) 
[[{}, {}, {}, {}], [{}, {}, {}], [{}, {}], [{}], []] 

당신은 항상 sorted(a, key=len, reverse=True)[0:k]에 의해 sorted의 결과를 배분하고 이후 최고 k를 선택할 수 있습니다.

주목할 주요 관찰은 인수 key이며 어떤 미친 lambda 기능도 허용 할 수 있습니다.

l = [[{},{},{},{}],[{},{},{}],[{},{}],[{}],[]] 

당신이 원하는 3 개 요소를 완전히 새로운 목록을 생성하고 수행 할 수 있습니다 : 당신은 두 가지 옵션이 있습니다