2015-05-25 14 views
6

क्या स्ट्रिंग्स की सूची से उन तारों को फ़िल्टर करने का कोई विकल्प है जिसमें उदाहरण के लिए 3 बराबर वर्ण हैं? मैंने एक तरीका बनाया जो ऐसा कर सकता है लेकिन मैं उत्सुक हूं कि क्या ऐसा करने के लिए एक और पाइथोनिक तरीका या अधिक कुशल या अधिक सरल तरीका है।फ़िल्टर स्ट्रिंग्स जहां पंक्ति में n बराबर वर्ण हैं

list_of_strings = [] 


def check_3_in_row(string): 
    for ch in set(string): 
     if ch*3 in string: 
      return True 
    return False 

new_list = [x for x in list_of_strings if check_3_in_row(x)] 

संपादित करें: मैं सिर्फ एक ही समाधान में पता चला है:

new_list = [x for x in set(keywords) if any(ch*3 in x for ch in x)] 

लेकिन मुझे यकीन है जो तरीका है तेजी से नहीं कर रहा हूँ - regexp या इस।

+0

संबंधित: [लगातार दोहराए गए वर्णों को खोजने के लिए पुनः उपयोग करें] (http://stackoverflow.com/questions/7147796/python-use-re-to-find-consecutively-repeated-chars) –

उत्तर

6

आप इस

>>> list_of_strings = ["aaa", "dasdas", "aaafff", "afff", "abbbc"] 
>>> [x for x in list_of_strings if re.search(r'(.)\1{2}', x)] 
['aaa', 'aaafff', 'afff', 'abbbc'] 

यहाँ की तरह नियमित अभिव्यक्ति का उपयोग कर सकते, . किसी भी चरित्र से मेल खाता है और यह एक समूह ((.)) में कब्जा कर लिया है। और हम जांचते हैं कि क्या एक ही कब्जा कर लिया गया चरित्र (हम बैकरेफर \1 स्ट्रिंग में पहले कैप्चर किए गए समूह को संदर्भित करते हैं) दो बार प्रकट होता है ({2} का अर्थ दो बार होता है)।

+0

उत्तर के लिए धन्यवाद। अच्छा समाधान मुझे पहले से ही एक रास्ता मिल गया है - मैंने अपनी पोस्ट संपादित की है। –

+0

@ मिलन आप चेक करने के लिए 'टाइमिट' मॉड्यूल का उपयोग कर सकते हैं। लेकिन RegEx संस्करण आपके 'किसी भी संस्करण' से बेहतर हो सकता है। – thefourtheye

+0

मेरा _guess_ यह है कि तार लंबे समय तक तेज हो जाएंगे, क्योंकि यह केवल एक बार प्रत्येक स्ट्रिंग के माध्यम से स्कैन करता है, जबकि 'any() 'दृष्टिकोण _ __ लंबाई स्ट्रिंग _n_ बार स्कैन करता है। ओटीओएच, यदि सूची में अधिकांश तार _do_ में 3 का समूह होता है, और वह समूह स्ट्रिंग की शुरुआत के करीब होता है, तो 'कोई भी() 'दृष्टिकोण _might_ तेज़ हो जाता है। –

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