проверка, находится ли строка в алфавитном порядке в python
Я собрал следующий код, чтобы проверить, упорядочена ли строка/слово в алфавитном порядке:
def isInAlphabeticalOrder(word):
word1=sorted(word)
word2=[]
for i in word:
word2.append(i)
if word2 == word1:
return True
else:
return False
Но я чувствую, что должен быть более эффективный способ (меньше строк кода) для проверки, кроме превращения строк в списки. Разве нет операнда для сортировки строк по алфавиту, не превращая каждый символ в список? Может ли кто-нибудь предложить более эффективный способ?
7 ответов:
Это имеет преимущество быть O (n) (сортировка строки-O (N log n)). Символ (или строка) в Python "меньше" другого символа, если он стоит перед ним в алфавитном порядке, поэтому для того, чтобы увидеть, находится ли строка в алфавитном порядке, нам просто нужно сравнить каждую пару соседних символов. Кроме того, обратите внимание, что вы берете range(LEN(word) - 1) вместо range(len(word)), потому что в противном случае вы переступите границы строки на последней итерации цикла.
def isInAlphabeticalOrder(word): for i in range(len(word) - 1): if word[i] > word[i + 1]: return False return True
Это простой (и Python идиоматический) способ сделать это:
def isInAlphabeticalOrder(word): return word==''.join(sorted(word)) >>> isInAlphabeticalOrder('abc') True >>> isInAlphabeticalOrder('acb') False
Вы можете использовать
generatorв своей функции следующим образом: -Генератор получает каждое значениеdef isInAlphabeticalOrder(word): return all((word[i+1] >= word[i] for i in range(len(word) - 1)))iиз заданного диапазона и сравнивает символ в этом индексе с символом в предыдущем Индексе. И все результаты сравнения передаются в функциюall, которая возвращаетTrue, если все значения равны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
Конечно, это не учитывает
case-insensitivity. Если вы хотите рассмотреть его, то измените оператор return на: -return all((str.lower(word[i+1]) >= str.lower(word[i]) for i in range(len(word) - 1)))
Программа вернет true, если слово расположено в алфавитном порядке, или false в противном случае. Второй аргумент wordList инициализируется в None, что означает, что программа будет проверять любое слово, которое вы вставляете, включая числа:
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
Несколько ответов уже касались фактического сравнения строк. Но я хочу добавить немного о вашей логике возвращения.
Обычно для начинающих пишется код типа:
if something == somethingElse: return True else: return FalseЭтот код всегда можно упростить следующим образом:
return something == somethingElseЕсли этот код сначала не имеет смысла, он читается как "сравните что-то с чем-то другим и верните результат сравнения".
Comments