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.isdigit
或try/except
,我将如何找到。代码不断检查第一个字符,而不是全部。我该如何解决这个问题?
答案 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)
您可以使用all
和generator 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 NUMBERS
将is_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