2012-12-01 42 views
9

我已经把下面的代码来检查,如果一个字符串/单词的字母顺序排列:检查一个字符串是否是按字母顺序在python

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

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

+0

帕乌Ametvic你认为** 'ABC DEF' **和**'ABC!= ghu'**按字母顺序排列还是不行? – eyquem

回答

12

这具有澳优势(n)(排序字符串是O(n log n))。 Python中的一个字符(或字符串)如果以字母顺序出现在另一个字符之前“小于”,所以为了查看字符串是否按字母顺序排列,我们只需要比较每对相邻字符。此外,请注意,您将取代范围(len(word) - 1)而不是范围(len(word)),否则您将在循环的最后一次迭代中超出字符串的范围。

def isInAlphabeticalOrder(word): 
    for i in range(len(word) - 1): 
     if word[i] > word[i + 1]: 
      return False 
    return True 
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))) 
+0

撇号如何在'不'? – DSM

+0

@DSM ..处理了这种情况。 –

+0

@DSM。其实这是没有妥善处理。删除。我认为,我们需要编写一个for循环。 –

12

这是一个简单的(和Python惯用语)的方式来做到这一点:

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

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

哇,这很不错。但是,我感觉OP是一名编程学生,被引入循环。如果这是真的,那么这样做并不会有助于理解循环。 :) – kreativitea

+0

@kreativitea:也许吧。但是我认为让学生学习所选语言的习语也很重要。在Python中这是一种非常习惯的方式。如果语言是C,那么循环或库是... – 2012-12-01 17:10:38

+4

我喜欢这个然后:'list(word)== sorted(word)' – kreativitea

3

试试这个,作为一个班轮:如果这个词是按字母顺序排列否则为false

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

程序将返回true。第二个参数单词表被初始化为无意思程序将检查你把在包括数字的任何单词:

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 
0

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

是很常见的初学者编写的代码,如:起初它的内容

return something == somethingElse 

如果代码没有意义:

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

该代码总是可以被简化,这样,“将Something与SomethingElse比较,并返回比较结果”。

1

这是最简单的:

def alphabetical(word): 
    return list(word) == sorted(word) 
相关问题