如何在没有try / except或str.isdigit的情况下检查字符串是否有数字?

时间:2014-11-05 02:00:25

标签: python string validation input

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,我将如何找到。代码不断检查第一个字符,而不是全部。我该如何解决这个问题?

7 个答案:

答案 0 :(得分:3)

NUMBERS = "123456789"

def digit_checker(x):
    y = True
    for t in  x:
        if t not in NUMBERS:
           y = False
    return y

答案 1 :(得分: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)(线性)搜索字符串。当然,对于这么小的字符串,线性搜索的性能影响并不太令人担忧。但是,无论何时使用较大的字符串,这都会很快发生变化。

答案 2 :(得分:1)

实际上,看起来它正在检查每个角色,但因为它为每个角色设置y,所以它是#34;无数"确定返回值的最后一个字符,无论其他字符是什么。

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

如果您正在为所有字母都是数字这一事实做饭,您可以尝试以下表达式:

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

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

答案 5 :(得分:0)

也许如果你清理变量名称,问题会更清楚:

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并打破循环。

答案 6 :(得分:0)

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

NUMBERS = "1234567890"

def digit_checker(x):
    return len([t for t in x if t not in NUMBERS]) == 0


print digit_checker('123') #True