在Python中检查字符串是否按字母顺序排列

13

我已经编写了以下代码来检查一个字符串/单词是否按字母顺序排列:

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

但我感觉应该有一种更有效率的方法(代码行数更少)来检查,而不是将字符串转换为列表。难道没有一种操作符可以按字母顺序对字符串进行排序,而无需将每个字符转换为列表吗?有人可以建议更有效的方法吗?


Pav Ametvic,您认为“abc def”和“abc!=ghu”是否按字母顺序排列? - eyquem
7个回答

20

这种方法的优点是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

15
这是一个简单的(并且符合 Python 习惯用法的)做法:
def isInAlphabeticalOrder(word):
    return word==''.join(sorted(word))

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

哇,这很棒。但是我感觉OP是一名编程学生,正在了解循环。如果是这样的话,用这种方法来做事情并不利于理解循环。 :) - kreativitea
@kreativitea:也许吧。但我认为学生学习所选语言的习语也很重要。这是在Python中实现这一点的非常习惯用的方式。如果语言是C,那么循环或库就是方法... - user648852
6
我喜欢这个条件:list(word) == sorted(word) - kreativitea

8

这是最简单的方法:

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

4

试试这个一行代码:

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

3
您可以在函数中像这样使用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

当然,上述内容没有考虑大小写不敏感的情况。如果你想要考虑,那么就把返回语句改成:-
return all((str.lower(word[i+1]) >= str.lower(word[i]) for i in range(len(word) - 1)))

关于撇号,例如在 don't 中怎么处理? - DSM
@DSM。实际上那个没有被正确处理。已经移除了。我认为我们需要编写一个for循环来解决这个问题。 - Rohit Jain

1
几个答案已经解决了实际的字符串比较问题。但我想再补充一点关于您的返回逻辑。
初学者通常会编写以下代码:
if something == somethingElse:
  return True
else:
  return False

那段代码总是可以像这样简化:
return something == somethingElse

如果一开始这段代码看起来不太好理解,它的意思是:“将某个东西与SomethingElse进行比较,并返回比较结果”。

0
程序将返回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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接