проверка строки в алфавитном порядке в python

Я собрал следующий код, чтобы проверить, упорядочена ли строка / слово по алфавиту:

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

но я чувствую, что должен быть более эффективный способ (меньшее количество строк кода), чтобы проверить, кроме как превратить строки в списки. Разве нет операнда для сортировки строк в алфавитном порядке, не превращая каждый символ в список? Может ли кто-нибудь предложить более эффективный способ?

  • как код a Кнопка изображения в PyQt?
  • один-ко-многим встроенный выбор с django admin
  • Крюк для добавления команд для создания distutils?
  • Скриншот Python windows 7 без PIL
  • pandas DataFrame - Получение часов в течение продолжительности
  • как выполнить стабильное обнаружение угла глаз?
  • Python modulo на поплавках
  • Как разобрать строку, представляющую вложенный список, в фактический список?
  • 7 Solutions collect form web for “проверка строки в алфавитном порядке в python”

    Это имеет то преимущество, что O (n) (сортировка строки – O (n log n)). Символ (или строка) в Python «меньше» другого символа, если он предшествует ему в алфавитном порядке, поэтому, чтобы увидеть, есть ли строка в алфавитном порядке, нам просто нужно сравнить каждую пару соседних символов. Также обратите внимание, что вместо диапазона (len (word)) вы выбираете диапазон (len (word) – 1), потому что иначе вы переступите границы строки на последней итерации цикла.

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

    Попробуйте это, как однострочный:

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

    Это самый простой способ:

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

    Программа вернет 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 

    Если этот код не имеет смысла сначала, он читается как «Сравнить что-то с SomethingElse и возвращать результат сравнения».

    Python - лучший язык программирования в мире.