2012-04-08 17 views
6

Solo curioso, qual è il modo più poderoso/efficace per determinare se la sequenza di 3 caratteri è in ordine alfabetico consecutivo?come verificare se 3 caratteri sono in ordine alfabetico consecutivo

Sotto un modo rapido & che sembra funzionare, altre implementazioni più piacevoli?

Suppongo che un approccio alternativo potrebbe essere quello di ordinare una copia della sequenza e confrontarla con l'originale. No, questo non considererebbe per gli spazi vuoti nella sequenza.

(Questo non è lavoro - gli ascoltatori di NPR Domenica Mattina progamma volontà conoscenze)

def checkSequence(n1, n2, n3): 
    """ check for consecutive sequence of 3 """ 
    s = ord('a') 
    e = ord('z') 

# print n1, n2, n3 
    for i in range(s, e+1): 
     if ((n1+1) == n2) and ((n2+1) == n3): 
      return True 

    return False 


def compareSlice(letters): 
    """ grab 3 letters and sent for comparison """ 

    letters = letters.lower() 
    if checkSequence(ord(letters[0]), ord(letters[1]), ord(letters[2])): 
     print '==> seq: %s' % letters 
     return True 

    return False 
+2

È questo il [ragione] (http://www.npr.org/2012/04/08/150202658/a- mix-up-at-the-music-fest)? – eabraham

+0

Sembra che il prossimo passo sia un dizionario da controllare. Prova [questo] (http://thedatahub.org/dataset/wiktionary/resource/8147edd1-6932-4816-aa88-2fa4fdc60ab5). – eabraham

+0

@eabraham Close .. :-) – Levon

risposta

11

Facile:

>>> letters = "Cde" 
>>> from string import ascii_lowercase 
>>> letters.lower() in ascii_lowercase 
True 
>>> letters = "Abg" 
>>> letters.lower() in ascii_lowercase 
False 

In alternativa, si potrebbe usare string.find().

>>> letters = "lmn" 
>>> ascii_lowercase.find(letters) != -1 
True 

immagino una funzione che utilizza questo sarebbe simile:

def checkSequence(*letters): 
    return ''.join(letters).lower() in ascii_lowercase 
+0

Questa mi sembra la soluzione più avanzata e semplice, molto bella. – Levon

+0

tabella di ricerca è sempre conveniente per le normali dimensioni dei dati, cool – okm

1

Che ne dite di qualcosa di simile:

l = letters.lower() 
if len(l)>=3 and ord(l[0])+2==ord(l[1])+1==ord(l[2]): print "yes" 
else: print "no" 
+0

grazie - sembra molto simile anche al mio approccio. – Levon

5

Ecco un modo divinatorio bello per controllare che per arbitrariamente lunghe sequenze di caratteri:

def consecutive_chars(l): 
    return all(ord(l[i+1])-ord(l[i]) == 1 for i in range(len(l)-1)) 
+0

Modificato per rimuovere le parentesi quadre per rendere 'tutto' iterato su un generatore, invece di creare l'intera lista di' True's e 'False's per primi. – Acorn

+0

pulito .. per qualche motivo non avevo incontrato la funzione integrata all() prima di – Levon

+0

@Acom - grazie per la correzione. –

4
ord('a') < ord(a)+1 == ord(b) == ord(c)-1 < ord('z') 
+0

+1 Molto interessante! E l'unica risposta qui è corretta. A tutti gli altri manca il controllo alfabetico. –

+0

cool - grazie per la soluzione – Levon

+0

@MarkByers Sì è =), anche se qui lo spazio della soluzione è limitato e la ricerca diretta è più semplice – okm

4

Questo potrebbe essere semplicemente fatto come

>>> x=['a','b','c'] 
>>> y=['a','c','b'] 
>>> z=['c','b','a'] 
>>> x==sorted(x) or x == sorted(x,reverse=True) 
True 
>>> y==sorted(x) or y == sorted(y,reverse=True) 
False 
>>> z==sorted(x) or z == sorted(z,reverse=True) 
True 
>>> 

Pensare in questo modo. Le lettere sono consecutive se sono ordinate in ordine ascendente o discendente.

Come sottolineato nel commento come questo non funzionerà se la sequenza contiene fori, un altro approccio sarebbe

>>> ''.join(x).lower() in string.lowercase 
True 
>>> 
+1

Questo approccio è già stato menzionato nella domanda e, come sottolinea l'OP, non funziona. –

+0

@MarkByers: Ho aggiornato la mia risposta con un'altra possibile soluzione – Abhijit

+0

Tuttavia, è ancora sbagliato. "asso" dà "Vero". E dovresti usare '//' not '/'. Senza questa modifica il tuo codice darà un errore in Python 3. –

Problemi correlati