12

我整理了以下代码来检查字符串/单词是否按字母顺序排列:

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

但我觉得除了将字符串转换为列表之外,必须有一种更有效的方法(更少的代码行)来检查。是不是有一个操作数可以按字母顺序对字符串进行排序而不将每个字符变成一个列表?任何人都可以提出更有效的方法吗?

4

7 回答 7

18

这具有 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
于 2012-12-01T17:08:18.163 回答
14

这是一种简单的(和 Python 惯用的)方法:

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

>>> isInAlphabeticalOrder('abc')
True
>>> isInAlphabeticalOrder('acb')    
False
于 2012-12-01T16:57:03.847 回答
6

这是最简单的:

def alphabetical(word):
    return list(word) == sorted(word)
于 2017-04-03T09:01:01.200 回答
4

试试这个,作为一个单行:

all(x <= y for x, y in zip(word, word[1:]))
于 2012-12-01T17:10:28.367 回答
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

当然那不考虑case-insensitivity。如果你想考虑它,那么将return语句更改为: -

return all((str.lower(word[i+1]) >= str.lower(word[i]) for i in range(len(word) - 1)))
于 2012-12-01T16:55:41.830 回答
1

几个答案已经解决了实际的字符串比较。但我想补充一点关于您的返回逻辑。

初学者编写如下代码是很常见的:

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

该代码总是可以像这样简化:

return something == somethingElse

如果该代码一开始没有意义,它会读作“将某些内容与SomethingElse进行比较,并返回比较结果”。

于 2016-12-05T04:10:16.317 回答
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
于 2016-03-12T08:32:04.570 回答