2012-04-08 7 views
6

Nur neugierig, was ist die pythisch/effiziente Art zu bestimmen, ob Sequenz von 3 Zeichen in alphabetischer Reihenfolge sind?wie überprüft man, ob 3 Zeichen in alphabetischer Reihenfolge sind

Unter einer schnellen & schmutzige Art, die zu funktionieren scheint, andere, bessere Implementierungen?

Ich denke, ein alternativer Ansatz könnte sein, eine Kopie der Sequenz zu sortieren und sie mit dem Original zu vergleichen. Nein, das würde für Lücken in der Sequenz nicht berücksichtigen.

(Dies ist keine Hausaufgaben - Zuhörer zu NPR Sunday Morning Progamm wird Know)

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

Ist das der [Grund] (http://www.npr.org/2012/04/08/150202658/a- Mix-Up-bei-der-Musik-Fest)? – eabraham

+0

Es scheint so, als ob der nächste Schritt ein Wörterbuch ist, gegen das zu prüfen ist. Versuchen Sie [dies] (http://thedatahub.org/dataset/wiktionary/resource/8147edd1-6932-4816-aa88-2fa4fdc60ab5). – eabraham

+0

@eabraham Schließen .. :-) – Levon

Antwort

11

einfach sein:

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

Alternativ kann ein string.find() nutzen könnte.

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

Ich denke, eine Funktion, diese mit würde wie folgt aussehen:

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

Dies scheint mir die vorderste und einfachste Lösung, sehr nett. – Levon

+0

Tabellensuche ist immer bequem für normale Datengröße, cool – okm

1

Wie wäre es damit so etwas wie:

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

danke - scheint mir auch sehr ähnlich zu sein. – Levon

5

Hier ist eine nette pythonic Weise, dass für beliebig zu überprüfen lange Sequenzen von Zeichen:

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

Bearbeitet, um die eckigen Klammern zu entfernen, damit "alle" über einen Generator iterieren, anstatt die gesamte Liste von 'True's und' False's zuerst zu erstellen. – Acorn

+0

ordentlich .. aus irgendeinem Grund hatte ich nicht die eingebaute all() Funktion vor – Levon

+0

@Acom - vielen Dank für die Lösung. –

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

+1 Sehr interessant! Und die einzige Antwort hier ist richtig. Alle anderen verpassen die alphabetische Überprüfung. –

+0

cool - danke für die Lösung – Levon

+0

@MarkByers Ja ist es =), obwohl hier Lösungsraum ist begrenzt und direkte Suche ist einfacher – okm

4

Dieses einfach als

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

Denken Sie es auf diese Weise getan werden könnte. Buchstaben sind aufeinanderfolgend, wenn sie entweder aufsteigend oder absteigend sortiert sind.

Wie im Kommentar darauf hingewiesen, wie das wird nicht funktionieren, wenn die Sequenz Löcher enthält, wäre ein weiterer Ansatz

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

Dieser Ansatz wurde bereits in der Frage erwähnt und, wie das OP darauf hinweist, funktioniert es nicht. –

+0

@MarkByers: Ich habe meine Antwort mit einer anderen möglichen Lösung aktualisiert – Abhijit

+0

Immer noch falsch ist. 'Ass' gibt' True'. Und du solltest '//' not '/' benutzen. Ohne diese Änderung wird Ihr Code in Python 3 einen Fehler geben. –