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



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



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


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

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

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

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

Если этот код сначала не имеет смысла, он читается как "сравните что-то с чем-то другим и верните результат сравнения".

Comments

    Ничего не найдено.