2012-12-01 17 views
9

ho messo insieme il seguente codice per controllare se una stringa/parola è ordinato in ordine alfabetico:controllare se una stringa è in ordine alfabetico in python

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

ma mi sento come se ci deve essere un modo più efficiente (meno righe di codice) per controllare altro che trasformare le stringhe in liste. Non c'è un operando per ordinare le stringhe alfabeticamente senza trasformare ogni carattere in una lista? Qualcuno può suggerire un modo più efficiente?

+0

Pav Ametvic Lei considera ** 'abc def' ** e ** 'abc!= ghu '** in ordine alfabetico o no? – eyquem

risposta

12

Questo ha il vantaggio di essere O (n) (l'ordinamento di una stringa è O (n log n)). Un carattere (o una stringa) in Python è "minore di" un altro carattere se viene prima di esso in ordine alfabetico, quindi per vedere se una stringa è in ordine alfabetico, dobbiamo solo confrontare ogni coppia di caratteri adiacenti. Inoltre, tieni conto che prendi range (len (word) - 1) invece di range (len (word)) perché altrimenti supererai i limiti della stringa sull'ultima iterazione del loop.

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

È possibile utilizzare generator nella funzione in questo modo: -

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

Il generatore ottiene ogni valore della i dalla gamma data, e confrontare il carattere in tale indice con quello nell'indice precedente. E tutti i risultati del confronto vengono passati alla funzione all, che restituirà True se tutti i valori sono True.

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

Certo che non considera case-insensitivity. Se si vuole prendere in considerazione, quindi modificare l'istruzione return a: -

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

Che dire degli apostrofi, ad es. in 'don't'? – DSM

+0

@DSM .. Gestito il caso. –

+0

@DSM. In realtà non funzionava correttamente. Rimosso. Penso che per questo, abbiamo bisogno di scrivere un ciclo for. –

12

questo è un modo semplice (e Python idiomatica) per fare questo:

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

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

wow, è abbastanza buono. Ma ho la sensazione che l'OP sia uno studente di programmazione, che viene introdotto al ciclo. Se è vero, fare le cose in questo modo non sarebbe favorevole alla comprensione dei loop. :) – kreativitea

+0

@kreativitea: Forse. Ma penso che sia importante anche per uno studente imparare gli idiomi della lingua scelta. Questo è un modo molto idiomatico per farlo in Python. Se il linguaggio era C, quindi il loop o una libreria è il modo ... –

+4

mi piace questo: 'list (word) == ordinato (word)' – kreativitea

3

Prova questa, come una battuta:

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

Il programma ritorna vero se la parola è disposta alfabetico o false in caso contrario. Il secondo argomento è listaParole inizializzato su Nessuno significa che il programma controlla per qualsiasi parola che si mette in compresi i numeri:

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

Diverse risposte hanno già affrontato il confronto stringa effettiva. Ma voglio aggiungere un po 'della tua logica di ritorno.

E 'comune per i principianti a scrivere codice come:

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

che il codice può essere semplificata sempre così:

return something == somethingElse 

Se tale codice non ha senso in un primo momento si legge come , "Confronta qualcosa con SomethingElse e restituisci il risultato del confronto".

1

Questo è il più facile:

def alphabetical(word): 
    return list(word) == sorted(word) 
Problemi correlati