检查数字是否仅由两个数字组合而成
我写了一个函数,用来检查一个数字是否有除了3和5以外的其他数字,如果有就返回false。
def isDecent(n):
digits = list(map(int, str(n)))
for digit in digits:
if digit != 3 or digit != 5: return False
return True
print(isDecent(5553334))
但是不幸的是,这个函数没有正常工作!我能知道问题出在哪里吗?
7 个回答
1
你可以使用集合(set):
d=str(55555333)
r=''.join(set(d))
if r in '353':
print "Number contains 3 or 5"
1
我建议不要把它转换成字符串:
def isDecent(n):
if n == 0:
return False
while n:
if n % 10 not in (3, 5, ):
return False
n //= 10
return True
1
你的问题是你用了or
,其实应该用and
。
只需要把你的代码改成这样:
def isDecent(n):
digits = list(map(int, str(n)))
for digit in digits:
if digit != 3 and digit != 5: return False
return True
print(isDecent(555333))
然后一切就正常了!
2
因为“为什么”这个问题已经有人回答过了,所以我来告诉你怎么高效地做到这一点。
def isDecent(n):
return all(char in '35' for char in str(n))
这是同样内容的姐妹版本。
def isDecent(n):
return not any(char not in '35' for char in str(n))
6
总是会有这样的情况:digit != 3
或者 digit != 5
。所以这个条件永远会返回假。
把 or
改成 and
。
另外,你也可以这样检查:
if digit not in (3, 5):
其实,我们并不需要把字符转换成整数来检查是否相等,你可以直接这样做:
def isDecent(n):
digits = str(n)
return all(digit in ("3", "5") for digit in digits)
或者甚至可以用 digit in "35"
... 不过我觉得这样可读性稍差。
还有一个选择是使用集合:
def isDecent(n):
return set(str(n)).issubset('35')