2012-12-01 6 views
9

Ich habe den folgenden Code zusammen zu überprüfen, ob eine Zeichenfolge/Wort alphabetisch geordnet ist:prüft wird, ob ein String in alphabetischer Reihenfolge in Python ist

def isInAlphabeticalOrder(word): 
    word1=sorted(word) 
    word2=[] 
    for i in word: 
     word2.append(i) 
    if word2 == word1: 
     return True 
    else: 
     return False 

aber ich fühle mich wie es eine effizientere Art und Weise sein muß (weniger Codezeilen) zu überprüfen als die Zeichenfolgen in Listen umzuwandeln. Gibt es keinen Operanden, um Strings alphabetisch zu sortieren, ohne jedes Zeichen in eine Liste umzuwandeln? Kann jemand einen effizienteren Weg vorschlagen?

+0

Pav Ametvic Haben Sie ** 'abc def' ** und ** 'abc betrachten!= ghu '** alphabetisch geordnet oder nicht? – eyquem

Antwort

12

Dies hat den Vorteil, O sein (n) (das Sortieren einer Zeichenkette ist O (n log n)). Ein Zeichen (oder eine Zeichenkette) in Python ist "kleiner als" ein anderes Zeichen, wenn es in alphabetischer Reihenfolge davor steht. Um zu sehen, ob eine Zeichenkette in alphabetischer Reihenfolge ist, müssen wir nur jedes Paar benachbarter Zeichen vergleichen. Beachten Sie auch, dass Sie die Reichweite (len (Wort) - 1) anstelle von range (len (Wort)) verwenden, da Sie sonst die Grenzen der Zeichenfolge bei der letzten Iteration der Schleife überschreiten.

def isInAlphabeticalOrder(word): 
    for i in range(len(word) - 1): 
     if word[i] > word[i + 1]: 
      return False 
    return True 
3

Sie können generator in Ihrer Funktion wie folgt verwendet werden: -

def isInAlphabeticalOrder(word): 
    return all((word[i+1] >= word[i] for i in range(len(word) - 1))) 

Der Generator jeden Wert von i aus dem gegebenen Bereich bekommt, und das Zeichen an diesem Index mit der im vorherigen Index vergleichen. Und alle Vergleichsergebnisse werden an die Funktion all übergeben, die True zurückgibt, wenn alle Werte True sind.

>>> def isInAlphabeticalOrder(word): 
     return all((word[i+1] >= word[i] for i in range(len(word) - 1))) 

>>> isInAlphabeticalOrder("rohit") 
False 
>>> isInAlphabeticalOrder("aabc") 
True 
>>> isInAlphabeticalOrder("abc") 
True 

Natürlich, die nicht case-insensitivity betrachten ist. Wenn Sie es in Erwägung ziehen, dann die Aussage Rückkehr ändern: -

return all((str.lower(word[i+1]) >= str.lower(word[i]) for i in range(len(word) - 1))) 
+0

Was ist mit Apostrophen, z.B. in "nicht"? – DSM

+0

@DSM .. Behandelt diesen Fall. –

+0

@DSM. Eigentlich hat das nicht richtig funktioniert. Entfernt. Ich denke dafür müssen wir eine for-Schleife schreiben. –

12

Dies ist ein einfacher (und Python idiomatischer) Weg, dies zu tun:

def isInAlphabeticalOrder(word): 
    return word==''.join(sorted(word)) 

>>> isInAlphabeticalOrder('abc') 
True 
>>> isInAlphabeticalOrder('acb')  
False 
+0

Wow, das ist ziemlich gut. Aber ich habe das Gefühl, dass der OP ein Programmierschüler ist, der mit dem Schleifen vertraut gemacht wird. Wenn das stimmt, wäre es nicht förderlich, Schleifen zu verstehen, wenn man so vorgeht. :) – kreativitea

+0

@kreativitea: Vielleicht. Aber ich denke es ist auch wichtig für einen Schüler, die Idiome der gewählten Sprache zu lernen. Dies ist eine sehr idiomatische Methode, dies in Python zu tun. Wenn die Sprache C ist, dann ist looping oder eine Bibliothek der Weg ... –

+4

ich mag das dann: 'list (word) == sorted (word)' – kreativitea

3

Versuchen Sie diese, als Einzeiler:

all(x <= y for x, y in zip(word, word[1:])) 
0

Das Programm wahr zurück, wenn das Wort in alphabetischer Reihenfolge oder falsch anders angeordnet ist. Das zweite Argument ist auf None wordlist initialisiert das Programm bedeutet für jedes Wort prüfen, die Sie in mit Zahlen ausgedrückt:

def isAlphabeticalOrder(word, wordList = None): 
if (len(word) > 0): 
    curr = word[0] 
for letter in word: 
    if (curr > letter): 
     return False 
    else: 
     curr = letter 
if wordList is None: 
    return True 
return word in wordList 
0

Mehrere Antworten haben bereits den aktuellen String-Vergleich angesprochen. Aber ich möchte etwas über Ihre Rückkehrlogik hinzufügen.

Es ist üblich, für Anfänger wie Code zu schreiben:

if something == somethingElse: 
    return True 
else: 
    return False 

Dieser Code kann immer so vereinfacht werden:

return something == somethingElse 

Wenn dieser Code zunächst keinen Sinn macht es lautet wie , "Vergleichen Sie etwas mit SomethingElse, und geben Sie das Ergebnis des Vergleichs zurück".

1

Dies ist die einfachste:

def alphabetical(word): 
    return list(word) == sorted(word) 
Verwandte Themen