【问题标题】:How to check if the string has digits without a try/except or str.isdigit?如何检查字符串是否有没有try/except或str.isdigit的数字?
【发布时间】:2015-01-01 03:11:25
【问题描述】:
NUMBERS = "123456789"

def digit_checker(x):

    for t in  x:
        if t  in NUMBERS:
           y = True
        else:
           y = False
    return y



 sentence = input("Enter a string to check if its all digits: ")
 checker = digit_checker(sentence)
 print(checker)

正如标题所述,如果不使用str.isdigittry/except,我将如何找到字符串是否包含所有数字。代码不断检查第一个字符,而不是全部。我该如何解决?

【问题讨论】:

  • 它应该只检查给定sentence 中的最后一个字符,因为您正在遍历每个字符。
  • 您需要在第一次遇到 false 时退出,否则您可能会在以后将变量重新翻转为 true。在这种情况下,一次错误肯定是错误的。

标签: python string validation input


【解决方案1】:

实际上,它看起来像是在检查每个字符,但是因为它为每个字符设置了y,所以决定返回值的是最后一个字符的“无数”,而不管其他字符是什么。

相反,您应该将y 初始化为True,并且仅当您找到非数字时才将其设置为False。事实上,当这种情况发生时,您可以立即返回。

【讨论】:

    【解决方案2】:
    NUMBERS = "123456789"
    
    def digit_checker(x):
        y = True
        for t in  x:
            if t not in NUMBERS:
               y = False
        return y
    

    【讨论】:

    • 这是对他的代码进行的最小更改,这很棒……但是解释一下为什么会有所不同会很有帮助。
    • 除了这个答案不正确 - 它不适用于数字 10
    • 他的NUMBERS 中缺少0,但由于您正在检查数字字符串,因此只检查0-9。
    【解决方案3】:

    您可以使用allgenerator expression

    NUMBERS = "1234567890"
    
    def digit_checker(x):
        return all(t in NUMBERS for t in x)
    

    这将遍历x 中的每个字符,看看它是否在NUMBERS 中。如果没有,all 将立即停止检查并返回False。否则,它会在确认每个字符都是数字后返回True。下面是一个演示:

    >>> NUMBERS = "1234567890"
    >>> def digit_checker(x):
    ...     return all(t in NUMBERS for t in x)
    ...
    >>> digit_checker('12345')
    True
    >>> digit_checker('12345a')
    False
    >>>
    

    还要注意,如果您将NUMBERS 设为一组,效率会更高:

    NUMBERS = set("1234567890")
    

    这样,t in NUMBERS 将在字符串中执行 O(1)(常量)哈希查找,而不是 O(n)(线性)搜索。当然,在这么小的字符串上,线性搜索的性能影响并不太令人担忧。但是,当您使用较大的字符串时,这种情况会很快改变。

    【讨论】:

      【解决方案4】:

      也许如果你清除变量名问题会更清楚:

      def digit_checker(sentence):
          is_number = True
          for character in sentence:
              if character in NUMBERS:
                 is_number = True
              else:
                 is_number = False
          return is_number 
      

      如您所见,您正在评估它是否是每个字符的数字,并且每次都更改 is_number 变量。因此,只有 last 字符会导致正确的评估。

      您可能只想在首次检测到非数字时返回 False。尝试if character not in NUMBERSis_number 设置为False 并打破循环。

      【讨论】:

      • 为什么将其设置为 False 并中断?如果您想返回 False,只需 return False。如果你这样做了,你就不再需要is_number了。
      • 是的,你可以这样做。这只是风格偏好的问题。这里没关系,因为函数很小,但是对于较大的函数,我更喜欢单次返回。
      • 编写 5 行代码表示“返回 False”(正如您在解释中直接描述的那样),只是为了避免实际编写 return False 是愚蠢的。这在 C89 等其他语言中可能有意义,但从其他语言中引入偏见并不是编写可读 Python 代码的好方法。
      • 当您得到答案后可以简单地返回布尔值时,初始化一个额外的变量是没有意义的。如果字符串'9 askjdhaskjdbsakjdsa...' 已通过,为什么一旦找到数字的第一个实例就继续?
      • 只是风格偏好的问题。
      【解决方案5】:

      有一些很好的答案可以做到这一点。这是另一种方法。您可以计算非数字字符的数量,通过将它们存储在列表中,该列表的长度应该为零。

      NUMBERS = "1234567890"
      
      def digit_checker(x):
          return len([t for t in x if t not in NUMBERS]) == 0
      
      
      print digit_checker('123') #True
      

      【讨论】:

        【解决方案6】:
        NUMBERS = "1234567890" # Did you miss the 0?
        
        def digit_checker(x):
            all_digits = True
            for t in  x:
                if t not in NUMBERS:
                   all_digits = False
                   break
            return all_digits
        

        另一种方法是将它们作为集合进行检查:

        def digit_checker(x):
            return True if set(x).difference(set(NUMBERS)) == set() else False
        

        【讨论】:

        • +1 用于使用集合。请注意,您可以更简洁地将其写为:return set(x).difference(NUMBERS) == set()
        【解决方案7】:

        如果您对所有字母都是数字这一事实感到不满,您可以尝试以下表达式:

        def digit_checker(x):
            return all( t in NUMBERS for t in  x )
        

        它与您的代码完全相同,只是它还会检查x 中的所有字符是否都是数字。这是您的代码中缺少的内容。返回值总是被最后一次检查覆盖。当然,除非all 在内部为生成器表达式执行此操作,否则使用循环和中断可能会更有效,在这种情况下,两者完全等价。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-03-10
          • 2023-03-23
          • 1970-01-01
          • 2015-01-01
          • 1970-01-01
          • 2012-09-15
          • 2021-01-03
          相关资源
          最近更新 更多