2010-03-10 2 views
2
def sortProfiles(p): 
    return sorted(p, key=itemgetter('first_name')) 

사전 목록이 있습니다. 이 함수는 first_name으로 정렬 할 수있게 해준다. 그러나 대소 문자를 구분합니다. 당신이 sorted(p, key=lambda d: d['first_name'].lower())을 원하는처럼이 정렬 대/소문자를 구분하지 않는 방법은 무엇입니까?

return sorted(p, key=lambda x: x['first_name'].lower()) 
+0

이 질문에 대한 4 개의 답변은 모두 동일하지만 다음과 같습니다. D – dimo414

답변

7
>>> from operator import itemgetter 
>>> p = [{'fn':'bill'}, {'fn':'Bob'}, {'fn':'bobby'}] 
>>> sorted(p, key=itemgetter('fn')) 
[{'fn': 'Bob'}, {'fn': 'bill'}, {'fn': 'bobby'}] 
>>> sorted(p, key=lambda x: x['fn'].lower()) 
[{'fn': 'bill'}, {'fn': 'Bob'}, {'fn': 'bobby'}] 
>>> 
2

는 여기에 방법입니다. def 문에 포함 할 수, 어느 곳에서나 또 다른 문을 나타날 수 있습니다

def sortProfiles(p): 
    def lowerName(d): 
     return d['first_name'].lower() 
    return sorted(p, key=lowerName) 

: 당신이 lambda을 싫어하는 경우

1

것 같습니다 :

1
>>> def my_itemgetter(attr): 
     def get_attr(obj): 
      return obj.get(attr, "").lower() 
     return get_attr 

>>> a= [{"a":"dA"},{"a":"ab"},{"a":"Ac"},{"a":"aa"}] 
>>> sorted(a, key=my_itemgetter("a")) 
[{'a': 'aa'}, {'a': 'ab'}, {'a': 'Ac'}, {'a': 'dA'}] 
+0

이는 솔루션을 지나치게 복잡하게 만듭니다. 또한,'my_itemgetter'는 더 나은 이름이어야합니다. –

+0

들여 쓰기를 고쳐 주시겠습니까? –

+0

@Mike : 그는 어떤 사이트에서 어떤 종류의 스 니펫을 복사해서는 안됩니다. 이것은 일반적인 솔루션을 제공하면서 필요한 것을 이해하는 것을 목적으로합니다. 그는 원하는대로 이름을 지을 수 있습니다. 람다를 사용하지 않음으로써 그는'itemgetter'를 원하는대로 복잡하게 만들 수 있습니다 (커스텀?). – voyager

1
def sortProfiles(p): 
    return sorted(p, key=lambda el: el['first_name'].lower()) 
1

, 당신은 예를 들어 키 - 추출기로 명명 된 기능을 사용할 수 있습니다 다른 함수의 몸. 이 경우 def, lambda 또는 sortProfiles 외부에있는 def의 중첩 중에서 선택하는 것이 대부분 스타일의 문제이지만, 마지막으로 성능을 향상시킬 수는 있습니다.

+0

람다를 싫어하나요? – TIMEX

+1

@alex, yep, 나는 그것을 싫어한다. 비록 때때로 아주 특별한 경우에 그것을 사용한다. 'def'는 프로파일 링, 디버깅, 로깅 호출의 삽입 용이성, 역 추적의 명확성 및 일반성 (표현식뿐만 아니라 문장 사용도 가능)에 대해 월등합니다. -'lambda'는 구체적인 이점을 보완하지 않고 단지 당신을 저장합니다 이름을 생각하는 것에서 ;-). –

관련 문제