2012-03-26 3 views
2

이 같은 사전의 목록을 감안할 경우와 사전의 목록을 정렬 :파이썬 문

x = [ 
     {'name':'a', 'student': 1 , 'age':19}, 
     {'name':'b', 'student': 0 , 'age':10} 
    ] 
나는 학생이 1과 동일한 경우에만 나이를 정렬 할

수 어떻게 든 넣어 그의 경우 다음 진술?

sortedlist = sorted(x, key=lambda k: k['age']) 

감사합니다, 당신은 하나 동일하지 않은 학생들 밖으로 던져 할 경우

+4

기타는 무엇입니까? –

+3

student! = 1이면 어떻게 하시겠습니까? 그것을 밖으로 던져? – istruble

+0

그리고 equel이 아닌 학생들을 어떻게 1로 분류하고 싶습니까? , 또한 반드시 람다인가? – alonisser

답변

7

lgetda + list comp 대신 itemgetter + generator를 사용하면 지금까지 발견 한 최상의 성능을 얻을 수 있습니다. 이것은 10k 엘리먼트의 목록으로 테스트되었습니다. 목록 대비 + 람다에 비해 거의 30 %의 속도 향상. 안전하게 '학생'을 가정 할 경우에도 다시 itemgetter 대 람다에 대해 d.get('student', 0) == 1

from operator import itemgetter 

sorted((d for d in x if d['student']==1), key=itemgetter('age')) 
  • 주를 사용할 필요 이상 더 빠른 속도를 얻을, 항상 유효한 키 직접 액세스합니다 있습니다 : 그 이유는 itemgetter가 빠르다 (그리고 나는 이것에 대해 대부분 확신한다.) 왜냐하면 코드의 C면에서 검색이 이루어지기 때문이다. 반면 람다를 사용하면 파이썬 쪽에서 느리게 수행됩니다.
+0

목록 comprehensions 대신 발전기를 사용하는 좋은 예입니다. 가장 빠르고 가장 비단 답 이군. – istruble

+0

istruble : 고마워. 실제로 세 가지 대답 사이의 숫자를 테스트했습니다. 10k 요소 목록을 사용하면 @ sys.stderr보다 ~ 13 % 빠릅니다. – jdi

1

: 당신은 단지 값을 던지는 경우

sortedlist = sorted([x for x in dicts if x['student']==1], key=lambda k:k['age']) 
2

당신이 할 수 있습니다

sorted([d for d in x if d.get('student', 0) == 1], key=itemgetter('age')) 

사용하고있는 람다 함수는 매우 일반적인 연산이며 다음과 같이 대체 할 수 있습니다. ith itemgetter.

+1

itemgetter를 사용하려고했을 것 같습니까? 내가 생각하지 않는 dict에 attrgetter를 사용할 수 없다. 이것은 깨졌습니다 : -/ – jdi

+0

Spot on comment @jdi. 캐치를 가져 주셔서 감사합니다. 나는 그들이 위험 할 정도로 자주 사용한다고 만 말할 수 있다고 생각합니다;) – istruble

+0

No prob. +1 itemgetter 함께가는 것 – jdi