【问题标题】:checking if a string is in alphabetical order in python检查字符串是否在python中按字母顺序排列
【发布时间】:2012-11-19 15:12:31
【问题描述】:

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

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' 是否按字母顺序排列?

标签: python string sorting


【解决方案1】:

这具有 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

【讨论】:

    【解决方案2】:

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

    def isInAlphabeticalOrder(word):
        return word==''.join(sorted(word))
    
    >>> isInAlphabeticalOrder('abc')
    True
    >>> isInAlphabeticalOrder('acb')    
    False
    

    【讨论】:

    • 哇,这很不错。但是,我觉得 OP 是一名编程学生,正在学习循环。如果这是真的,那么以这种方式做事将不利于理解循环。 :)
    • @kreativitea:也许吧。但我认为学生学习所选语言的习语也很重要。这是在 Python 中执行此操作的一种非常惯用的方式。如果语言是 C,那么循环或库就是方式......
    • 我喜欢这样:list(word) == sorted(word)
    【解决方案3】:

    这是最简单的:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        你可以像这样在你的函数中使用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)))
        

        【讨论】:

        • 撇号怎么样,例如在don't?
        • @DSM。实际上这并没有正确处理。已移除。我认为为此,我们需要编写一个 for 循环。
        【解决方案6】:

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

        初学者写这样的代码很常见:

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

        代码总是可以这样简化:

        return something == somethingElse
        

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

        【讨论】:

          【解决方案7】:

          如果单词按字母顺序排列,程序将返回 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
          

          【讨论】:

            猜你喜欢
            • 2012-01-31
            • 1970-01-01
            • 2019-04-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多