2010-02-01 2 views
20

이런 종류의 문제를 처리하는 데 어려움을 겪고 있습니다. 데이터베이스에서 읽은 데이터가 다시 읽 힙니다. 나는 accoutingdate에 정렬하고 싶다. 그러나 accoutingdate가 null 일 수 있습니다.파이썬에서 날짜 필드 정렬, 필드가 null 일 수 있습니다.

results = sorted(results, key=operator.itemgetter('accountingdate'), reverse=True) 

을하지만,이 폭탄 : 저는 현재 다음과 같은 일을 오전 : 때문에 널 (null) 인 일부 accoutingdates에 "형식 오류는 NoneType에 datetime.date을 비교할 수 없습니다."

이것을 처리하는 "가장 정확한"또는 "가장 평범한"방법은 무엇입니까? 모든 날짜 개체보다 작은 것으로

def nonecmp(a, b): 
    if a is None and b is None: 
    return 0 
    if a is None: 
    return -1 
    if b is None: 
    return 1 
    return cmp(a, b) 

results = sorted(results, cmp=nonecmp, ...) 

이 취급 None :

+0

'없음'은 어디에서 분류됩니까? 먼저? 마지막? 가운데 어딘가에? '없음'은 날짜와 비교할 때 무엇을 의미합니까? 2001 년 12 월 7 일 이전이나 이후에 '없음'입니까? –

+0

필자는 모든 유효한 날짜를 "이전"으로 None을 정렬하는 것이 좋습니다. – Wes

+0

Btw, 당신은 장소에서 목록을 정렬 할 수 있습니다 :'results = sorted (results, ...)'단순히'results.sort (...) ' –

답변

27

당신은 단지 당신이 None 값을 처리하는 방법을 결정해야 확실히 권리입니다. 예컨대 :

import datetime 
mindate = datetime.date(datetime.MINYEAR, 1, 1) 

def getaccountingdate(x): 
    return x['accountingdate'] or mindate 

results = sorted(results, key=getaccountingdate, reverse=True) 

그냥이 대신 cmp 함수를 정의보다 얼마나 간단하게 볼 - 당신은 몇 가지가 벤치마킹 할 경우 그 속도가 매우 빠르고이기도 찾을 수 있습니다! 이 key 함수 대신에 cmp 함수를 사용할 때 아무런 단점도없고, 그렇게하는 것이 나쁜 설계 선택 일 것입니다.

+0

나는 이것에 대한 나의 받아 들인 대답을 바꿨다. .. 매우 매끈 매끈한! 감사! – Wes

11

당신은 특별히 None를 처리하는 사용자 지정 정렬 기능을 사용할 수 있습니다. 당신이 목적을 정렬 None의 동등하게 취급하려는 datetime 값을 선택 - key= 기능을 사용

관련 문제