2010-06-03 20 views
5

PHP के साथ स्वतः पूर्ण-जैसी सुविधा PHP में, मेरे पास यह पंक्ति matches = preg_grep('/^for/', array_keys($hash)); थी जो यह करेगी कि यह शब्द हैक: फोर्क, फॉर्म इत्यादि जो $ हैश में हैं।एक पाइथन dict

पायथन में, मेरे पास 400,000 शब्दों के साथ एक निर्देश है। इसकी चाबियाँ वे शब्द हैं जिन्हें मैं एक ऑटो-पूर्ण सुविधा में प्रस्तुत करना चाहता हूं (इस मामले में मान व्यर्थ हैं)। मैं इनपुट से मेल खाने वाले अपने शब्दकोश से चाबियाँ कैसे वापस कर पाऊंगा?

उदाहरण के लिए (के रूप में पहले प्रयोग किया जाता), अगर मैं

my_dic = t{"fork" : True, "form" : True, "fold" : True, "fame" : True} 

है और मैं कुछ इनपुट "for" मिलता है, यह एक सूची "fork" की "form" वापस लौटा देंगे,।

>>> [s for s in my_dict if s.startswith('for')] 
['fork', 'form'] 
+0

''fold''' – SilentGhost

+0

'के लिए' '' '' '' '' '' '' '' '' '# ~साइलेंटहोस्ट: आप बिल्कुल सही, संपादित हैं। – tipu

उत्तर

6
>>> mydict={"fork" : True, "form" : True, "fold" : True, "fame" : True} 
>>> [k for k in mydict if k.startswith("for")] 
['fork', 'form'] 

यह: उदाहरण के लिए, str.startwith: रेगुलर एक्सप्रेशन का

1
>>> my_dict = {"fork" : True, "form" : True, "fold" : True, "fame" : True} 
>>> import re 
>>> [s for s in my_dict if re.search('^for', s) is not None] 
['fork', 'form'] 

का प्रयोग करें, अधिक सार्वभौमिक रूप में आप और अधिक जटिल खोज पैटर्न प्रदान कर सकता है अगर यह केवल उपसर्गों के बारे में है, तो आप स्ट्रिंग तरीकों का उपयोग कर सकता है नियमित अभिव्यक्ति का उपयोग करने से तेज़ होना चाहिए (और यदि आप केवल शब्द की शुरुआत की तलाश में हैं)।

0

आप my_dict.keys() के साथ my_dict से चाबियाँ प्राप्त कर सकते हैं। फिर, आप यह देखने के लिए प्रत्येक कुंजी के माध्यम से खोज सकते हैं कि यह आपकी नियमित अभिव्यक्ति से मेल खाता है या नहीं।

m = re.compile('^for') 
keys = [] 
for key in my_dict.keys(): 
    if m.match(key) != None: 
     keys.append(key) 
3

तो यह है कि तुम क्या पूछने के लिए एक सीधा जवाब नहीं है, लेकिन ..

ऐसा लगता है कि आप नहीं है वास्तव में बात यह है कि इस तरह की के लिए एक dict चाहते हैं, आप एक के लिए देख रहे पेड़ की तरह संरचना, सही?

फिर आप टाइप किए गए प्रत्येक अक्षर के लिए पेड़ पर चल सकते हैं (निरंतर समय), और उस उपसर्ग से मेल खाने वाले शब्दों के रूप में पेड़ के उस उपधारा से पत्तियां वापस कर सकते हैं।

+0

यह विशेष मामला एकमात्र समय नहीं है जब मैं dict का उपयोग कर रहा हूं। यह एक उलटा इंडेक्स है इसलिए मान दस्तावेज़ आईडी का एक सेट है जो मैं जो कर रहा हूं उसके लिए बिल्कुल महत्वपूर्ण है। कारण मैं एक नियम का उपयोग कर रहा हूं क्योंकि देखो एक पेड़ की तुलना में बहुत तेज़ होगा (स्मृति बहुत है, सीपीयू चक्र नहीं हैं) – tipu

+0

हालांकि ज्ञात-कुंजी लुकअप एक वृक्ष संरचना की तुलना में एक तीर के साथ तेज होगा, प्रत्येक परीक्षण करने के लिए आंशिक मैच के लिए कुंजी नहीं होगी - ऐसे मामलों में जहां आप अग्रिम कुंजी (जैसे कि आप प्रस्तुत करते हैं) को कुछ नहीं जानते हैं, कुछ और पेड़ की तरह बेहतर होगा। – pycruft

+2

Fyi, इस समस्या के लिए सही डेटा संरचना को ** trie ** कहा जाता है - लेकिन पायथन के stdlib में कोई नहीं है। –

1

यदि आप एक विशिष्ट लुकअप रणनीति (जैसे "स्टार्टविट 3 वर्ण" ऊपर उल्लिखित) चाहते हैं, तो संभवतः आप उस विचार के आधार पर एक विशिष्ट लुकअप शब्दकोश बनाकर त्वरित जीत प्राप्त कर सकते हैं।

q = {"fork":1, "form":2, "fold":3, "fame":4} 
from collections import defaultdict 
q1 = defaultdict(dict) 
for k,v in q.items(): 
    q1[k[:3]][k]=v 

यह आपको एक बहुत छोटे से अधिक एक .startswith प्रकार देखने करते हैं जाएगा

def getChoices(frag): 
    d = q1.get(frag[:3]) 
    if d is None: 
     return [] 
    return [ k for k in d.keys() if k.startswith(frag) ] 

सेट उम्मीद है कि है कि पूरे 400,000 कुंजी प्रसंस्करण की तुलना में बहुत जल्दी होना चाहिए।

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