2010-02-01 12 views
20

मुझे इस तरह के संचालन के लिए एक कठिन तरीके से आने में मुश्किल हो रही है। मेरे पास डेटाबेस पढ़ने से डेटा वापस आ रहा है। मैं accoutingdate पर सॉर्ट करना चाहता हूँ। हालांकि, accoutingdate कभी कभी शून्य हो सकता है। मैं वर्तमान में निम्नलिखित कर रहा हूँ:पायथन में, दिनांक फ़ील्ड पर सॉर्टिंग, फ़ील्ड कभी-कभी शून्य हो सकता है

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

लेकिन, के साथ इस बम: कुछ accoutingdates अशक्त होने के कारण "लेखन त्रुटि NoneType को datetime.date तुलना नहीं कर सकते"।

इसे संभालने के लिए "सबसे सही" या "सबसे पायथनिक" तरीका क्या है? सभी datetime वस्तुओं की तुलना में छोटे होने के रूप में

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

आपके प्रकार में कोई भी नहीं गिरता है? प्रथम? पिछले? बीच में कहीं? किसी दिनांक की तुलना में 'कोई नहीं' का अर्थ क्या होता है? 7 दिसंबर 2001 से पहले या उसके बाद 'कोई नहीं' है? –

+0

मेरी वरीयता किसी भी को सभी मान्य तिथियों के पहले "पहले" के रूप में सॉर्ट करना होगा। – Wes

+0

बीटीडब्ल्यू, आप अपनी सूची को जगह में सॉर्ट कर सकते हैं: 'results = sorted (results, ...)' केवल 'result.sort (...) ' –

उत्तर

27

एक key= समारोह का उपयोग करना निश्चित रूप से सही है, तो आप सिर्फ तुम कैसे None मूल्यों के इलाज के लिए तय करना है - एक datetime मूल्य है कि आप प्रयोजनों छँटाई के लिए 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 विशेष रूप से व्यवहार करता है एक कस्टम छँटाई समारोह इस्तेमाल कर सकते हैं।

संबंधित मुद्दे