2012-02-09 13 views
6

मैं अजगर में हैश तालिका को कार्यान्वित करना चाहता हूं। तालिका में एक वर्ग वस्तु कुंजी मान से जुड़ी होगी। समस्या यह है कि मैं कक्षा के सूचकांक को खोजने और इसे अपडेट करने के लिए महत्वपूर्ण मूल्य का उपयोग करना चाहता हूं (जो निश्चित रूप से कोई समस्या नहीं है)। लेकिन अगर मैं कक्षा के किसी विशेष मूल्य का उपयोग करके तालिका को सॉर्ट करना चाहता हूं तो मैं क्या कर सकता हूं।पायथन हैश टेबल डिज़ाइन

उदाहरण के लिए, मान लें कि हमारे पास तीन मान हैं: document_id, स्कोर और रैंक। एक वर्ग "दस्तावेज़" है जिसमें "स्कोर" और "रैंक" शामिल है। "document_id" तालिका की कुंजी होगी।

मैं कुंजी का उपयोग कर तालिका की विभिन्न प्रविष्टियों के "स्कोर" को अपडेट करना चाहता हूं: "document_id"। लेकिन जब स्कोर का अद्यतन किया जाता है, तो मैं स्कोर का उपयोग करके सूची/तालिका को क्रमबद्ध करना चाहता हूं और अद्यतन स्कोर के आधार पर "रैंक" वैरिएबल को रैंक मान असाइन करना चाहता हूं।

क्या कोई मुझे कृपया कुछ दिशा-निर्देश दे सकता है कि मैं कैसे आगे बढ़ सकता हूं? या शायद मुझे इसे एक सूची बनाना चाहिए?

तालिका की अधिकतम संख्या 25000-30000 तक हो सकती है।

धन्यवाद।

उत्तर

21

पायथन का नियम पहले से ही हैश टेबल है।

docs = sorted(doc_hash.itervalues(), key=operator.attrgetter('score'), reverse=True) 
for i, doc in enumerate(docs): 
    doc.rank = i 
+0

उत्तर के लिए धन्यवाद। लेकिन अगर मैं किसी दस्तावेज़ को अद्यतन/सम्मिलित करता हूं तो हर बार रैंक को अपडेट करने का प्रयास करता हूं, तो क्या सभी प्रविष्टि/अद्यतन के अंत में एक छंटनी के बजाए लूप का क्रम तेजी से बढ़ता नहीं है? मैं रैंक के साथ और कुछ नहीं कर रहा हूँ। उन्हें सॉर्ट करने के बाद, मैं उन्हें सिर्फ एक फाइल में रखूंगा। –

+0

मुझे नहीं पता कि आपका मतलब क्या है "तेजी से बढ़ता है"? आप दस्तावेज़ों का एक समूह जोड़ सकते हैं, और फिर अंत में रैंक को फिर से सौंप सकते हैं। मैं "हर बार जब आप एक डालते हैं" के बारे में गलत बात करते हैं। –

+0

मुझे खेद है, अगर यह दस्तावेज़ जोड़ने के अंत में है, तो यह ठीक है। मैं टेबल के आकार के बारे में बात कर रहा था। मैंने सोचा कि अगर मैं एक बड़ी मेज में एक प्रविष्टि दर्ज/अपडेट करता हूं तो मैं कुछ सॉर्टिंग चलाने की कोशिश करता हूं तो यह एक लंबी प्रक्रिया बन सकता है। –

0

कुछ इस तरह:

doc_hash = {} 
doc_hash[doc.id] = doc 

रैंक असाइन करने के लिए?

sorted_keys = sorted(d.keys(), key=lambda element: element['score']) 
for i in range(len(sorted_keys)): 
    d[sorted_keys[i]]['rank'] = i 

d में प्रत्येक तत्व को आवंटित एक रैंक अपने स्कोर के आधार पर (तत्वों शब्दकोशों होने के लिए और साथ ही लगाए गए)।

+9

'enumerate' के बारे में जानें। यह आपको खुश कर देगा :) –

4

OrderedDict का उपयोग क्यों नहीं करें?

>>> from collections import OrderedDict 

>>> # regular unsorted dictionary 
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} 

>>> # dictionary sorted by key 
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0])) 
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) 

>>> # dictionary sorted by value 
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1])) 
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)]) 

>>> # dictionary sorted by length of the key string 
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0]))) 
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)]) 
संबंधित मुद्दे