2010-02-01 13 views
20

Ho difficoltà a trovare un modo intelligente per gestire questo tipo. Ho i dati che tornano da un database letto. Voglio ordinare la data di accouting. Tuttavia, la valutazione dell'account potrebbe talvolta essere nulla. Attualmente sto facendo il seguente:In python, l'ordinamento sul campo data, il campo può talvolta essere nullo

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

Ma, questo bombe con "TypeError: non posso paragonare a datetime.date NoneType" a causa di alcuni accoutingdates essere nullo.

Qual è il modo "più corretto" o "più Pythoniano" per gestirlo?

+0

Dove si trova "Nessuna" nel tuo genere? Primo? Ultimo? Da qualche parte nel mezzo? Cosa significa "Nessuno" se confrontato con una data? 'None 'prima o dopo il 7 dicembre 2001? –

+0

La mia preferenza sarebbe ordinare Nessuno come "prima" di tutte le date valide. – Wes

+0

Btw, puoi ordinare il tuo elenco in posto: 'results = sorted (results, ...)' dovrebbe essere semplicemente 'results.sort (...)' –

risposta

27

Utilizzando una funzione key= è sicuramente giusto, devi solo decidere come trattare i valori None - scegliere un valore datetime che si vuole trattare come l'equivalente di None a fini di smistamento. Es .:

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

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

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

Basta vedere quanto più semplice è che definire una funzione cmp invece - e se fate qualche analisi comparativa troverete è anche significativamente più veloce! Non c'è niente di positivo nell'usare una funzione cmp invece di questa funzione key, e sarebbe una cattiva scelta progettuale farlo.

+0

Ho cambiato la mia risposta accettata a questo ... molto lucido! Grazie! – Wes

11

è possibile utilizzare una funzione di ordinamento personalizzata che tratta None appositamente:

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, ...) 

Questa tratta None ad essere più piccolo di tutti gli oggetti datetime.

Problemi correlati