2015-05-25 4 views
6

Esiste un'opzione su come filtrare tali stringhe dall'elenco di stringhe che contiene ad esempio 3 caratteri uguali in una riga? Ho creato un metodo che può farlo, ma sono curioso di sapere se esiste un modo più platonico o più efficiente o più semplice per farlo.Stringhe di filtro in cui sono presenti n caratteri uguali in una riga

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)] 

EDIT: Ho appena scoperto una soluzione:

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

Ma io non sono sicuro di quale modo è più veloce - regexp o del presente.

+0

Correlato: [utilizzare re per trovare caratteri ripetuti consecutivamente] (http://stackoverflow.com/questions/7147796/python-use-re-to-find-consecutively-repeated-chars) –

risposta

6

È possibile utilizzare espressioni regolari, come questo

>>> 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'] 

Qui, . corrisponde a qualsiasi carattere e viene catturato in un gruppo ((.)). E controlliamo se lo stesso carattere catturato (usiamo il riferimento posteriore \1 si riferisce al primo gruppo catturato nella stringa) appare altre due volte ({2} significa due volte).

+0

Grazie per la risposta. Bella soluzione Ho già scoperto un modo: ho modificato il mio post. –

+0

@Milan È possibile utilizzare il modulo 'timeit' per verificare. Ma la versione di RegEx potrebbe essere migliore della tua versione 'any'. – thefourtheye

+0

La mia _guess_ è che la regex sarà più veloce se le stringhe sono lunghe, dato che scansiona solo una volta ogni stringa, mentre l'approccio 'any()' analizza una stringa di lunghezza _n_ volte. OTOH, se la maggior parte delle stringhe nella lista _do_ contiene un gruppo di 3, e quel gruppo tende a verificarsi vicino all'inizio della stringa, allora l'approccio 'any()' _might_ sarà più veloce. –