2013-10-24 9 views
6

'helloyellowellow' जैसी स्ट्रिंग को देखते हुए, दिए गए स्ट्रिंग से सभी मान्य तारों को पार्स करें। (उदाहरण: [[नरक, हैलो, पीला], [कम, कम] ........]पायथन का उपयोग कर स्ट्रिंग पार्सिंग?

मैं कोड लिखने का सबसे अनुकूलित तरीका ढूंढ रहा हूं। यह मेरा है लेकिन मैं नहीं हूं यकीन है कि अगर यह सबसे अच्छा तरीका है

पूर्ण प्रकटीकरण - यह एक साक्षात्कार प्रश्न

master = [] 

# Dictionary for us to look up words 
def is_word(inputstr): 
    #returns True/False 


def processstring(fstr,secstr,li): 
    if is_word(fstr): 
     li.append(fstr) 
    if len(secstr) == 0: 
     if len(li) != 0: 
      master.append(li) 
     return 
    processstring(fstr+secstr[0], secstr[1:len(secstr)],li) 



def wrapperprocess(inpstr): 
    li = [] 
    if len(inpstr) == 0: 
     return 
    processstring('',inpstr,li) 
    wrapperprocess(inpstr[1:len(inpstr)]) 


wrapperprocess('helloyellowellow') 
print master 
+0

अपने समाधान में, लगता है कि आप भूल गया ' वापसी ली'। एक बेहतर तरीका है कि सूची बनाए रखने, इसे जोड़ने और इसे वापस करने के बजाय मिलान किए गए शब्दों को 'उपज' करना। – shx2

उत्तर

2

आप की तरह कुछ कर सकता था:।

tgt='helloyellowellow' 

with open('/usr/share/dict/words') as f: 
    for word in f: 
     word=word.strip() 
     if word in tgt and len(word)>1: 
      print word 

प्रिंटों:

अजगर सेट औसत look-up time of O(1) है एक डिफ़ॉल्ट डेटा संरचना के रूप में

def is_word(word, dic='/usr/share/dict/words'): 
    if not hasattr(is_word, 'words'): 
     with open(dic) as f: 
      is_word.words={word.strip() for word in f} 

    return word in is_word.words and len(word)>1 

,:

el 
ell 
he 
hell 
hello 
lo 
low 
loy 
ow 
owe 
we 
well 
ye 
yell 
yellow 

तुम सिर्फ समारोह is_word कि आप अपरिभाषित है के लिए देख रहे हैं, तो आप कुछ इस तरह के साथ खेल सकते हैं। आप अपने आप पर कुछ लिखने की संभावना नहीं है जो तेज़ है।

+0

कोड के लिए धन्यवाद। लेकिन, यदि आप अपनी स्ट्रिंग के साथ मिलान करने के लिए शब्दकोश से प्रत्येक शब्द को देख रहे हैं तो यह कैसे प्रभावी है? क्या आप लाखों मैच नहीं कर पाएंगे जब उनमें से केवल एक छोटा सा सबसेट मैच होगा? – user2917012

+2

इस मामले में 'कुशल' क्या है? मेरे (पुराने, धीमे) कंप्यूटर पर, यह 88 एमएस में निष्पादित होता है। पाइथन में बस 'हैलो' प्रिंट करना 22 एमएस लेता है, इसलिए 60 एमएमएस पर यह बहुत तेज़ है। एक समय में केवल एक शब्द स्मृति में है, इसलिए यह बहुत मेमोरी कुशल है। चूंकि मुझे लिखने के लिए लगभग 30 सेकंड लग गए, यह सुंदर प्रोग्रामर कुशल है। आप किस तरह से अधिक कुशल बनना चाहते हैं? ;-) – dawg

0

यह साथ हल करने के लिए अच्छा समस्या है,

उपयोग Wordnet पैकेज,

जबकि पार्स करने के लिए अपने दिए गए स्ट्रिंग कुछ सूचकांक के साथ शुरू करते हैं और सूचकांक पर हर वृद्धिशील के लिए अपने सूचकांक मूल्य परेशान रखने के लिए, के अस्तित्व की जाँच वर्डनेट का उपयोग करके वही शब्द, यह आपको बताएगा कि मौसम उप-स्ट्रिंग एक सार्थक है या नहीं!

wordnet स्थापित करने के लिए:

https://pypi.python.org/pypi/Wordnet-bn/1.0 
3

के बाद से आप का उल्लेख आप एक कुशल एल्गोरिथ्म के लिए देख रहे हैं, और आप पहले से शब्दकोश मिल (और सिर्फ एक प्रतिदेय विधेय के रूप में नहीं) यह सोचते हैं, तो आप उपयोग कर सकते हैं Aho–Corasick कलन विधि।

बेशक, यदि इनपुट टेक्स्ट छोटा है, तो शब्दकोश की "महंगी" प्री-प्रोसेसिंग से बचने के लिए एक और बेवकूफ एल्गोरिदम तेजी से होगा।

इसके अलावा, एक विकल्प के अजगर-जवाब: यहां बस प्रत्येक स्ट्रिंग की जाँच करने के लिए एक आसान तरीका है:

def gen_words(txt): 
    n = len(txt) 
    for i in range(n): 
     for j in range(i+1, n+1): 
      subtxt = txt[i:j] 
      if is_word(subtxt): 
       yield subtxt 

विशिष्टता के लिए, कार्य करें:

all_words = set(gen_words(txt)) 
संबंधित मुद्दे