Python 检查一个数字是否只有两个数字的组合

Python 检查一个数字是否只有两个数字的组合,python,numbers,Python,Numbers,我创建了一个函数来检查数字是否有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)) 但不幸的是它不起作用!我能知道这个问题吗?您的问题是使用了or而不是and 只需将代码更

我创建了一个函数来检查数字是否有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))

但不幸的是它不起作用!我能知道这个问题吗?

您的问题是使用了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))

然后一切都开始了

您的问题是使用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))
然后一切都开始了

这个数字总是正确的!=3或数字!=5.所以它总是返回False

将或更改为和

或者,将其检查为

if digit not in (3, 5):
事实上,我们不需要仅为了检查相等性而将字符转换为整数,您可以执行以下操作:

def isDecent(n):
    digits = str(n)
    return all(digit in ("3", "5") for digit in digits)
甚至是35的数字。。。但我认为这不太可读

另一个选项是使用集合:

def isDecent(n):
    return set(str(n)).issubset('35')
那个数字永远是真的!=3或数字!=5.所以它总是返回False

将或更改为和

或者,将其检查为

if digit not in (3, 5):
事实上,我们不需要仅为了检查相等性而将字符转换为整数,您可以执行以下操作:

def isDecent(n):
    digits = str(n)
    return all(digit in ("3", "5") for digit in digits)
甚至是35的数字。。。但我认为这不太可读

另一个选项是使用集合:

def isDecent(n):
    return set(str(n)).issubset('35')

既然“为什么”部分已经完成了,那么让我向您展示如何有效地执行此操作

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))

既然“为什么”部分已经完成了,那么让我向您展示如何有效地执行此操作

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))

其他人已经在你的代码中显示了这个问题,这里有一个替代方案

def isDecent(n):
     if not set(str(n)) - {'3','5','.'}:
             return False
     return True

如果strn包含除“3”、“5”或“.”以外的任何内容,则返回False on。

other在您的代码中显示了问题,下面是一个替代方案

def isDecent(n):
     if not set(str(n)) - {'3','5','.'}:
             return False
     return True

如果strn包含除“3”、“5”或“.”以外的任何内容,则返回False on。

我建议避免转换为字符串:

def isDecent(n):
    if n == 0:
        return False

    while n: 
        if n % 10 not in (3, 5, ): 
            return False 
        n //= 10

    return True 

我建议避免转换为字符串:

def isDecent(n):
    if n == 0:
        return False

    while n: 
        if n % 10 not in (3, 5, ): 
            return False 
        n //= 10

    return True 
您可以使用设置:

d=str(55555333)
r=''.join(set(d))
if r in '353':
    print "Number contains 3 or 5"
您可以使用设置:

d=str(55555333)
r=''.join(set(d))
if r in '353':
    print "Number contains 3 or 5"
另一个解决方案:

def isDecent(n):
    s = set([ x for x in str(n)])
    if len(s) > 2:
        return False
    return [False,True]['3' in s and '5' in s]

for i in [5553334, 5553133, 111115, 33333555]:
    print i, isDecent(i)
输出:

5553334 False
5553133 False
111115 False
5553335 True
另一个解决方案:

def isDecent(n):
    s = set([ x for x in str(n)])
    if len(s) > 2:
        return False
    return [False,True]['3' in s and '5' in s]

for i in [5553334, 5553133, 111115, 33333555]:
    print i, isDecent(i)
输出:

5553334 False
5553133 False
111115 False
5553335 True


为什么它不起作用?你有错误吗?这只是错误的结果吗?@isedev:在Python 3中,map是一个生成器,不返回列表。但你的观点仍然成立,因为它仍然有可能在发电机上循环。return setstrn.issupperset'35'@StevenRumbalski检查我的答案@斯文马尔纳奇:你是说子集。为什么它不起作用?你有错误吗?这只是错误的结果吗?@isedev:在Python 3中,map是一个生成器,不返回列表。但你的观点仍然成立,因为它仍然有可能在发电机上循环。return setstrn.issupperset'35'@StevenRumbalski检查我的答案@SvenMarcnach:您的意思是子集。在'35'中为strn中的数字返回alldigit将是一个不错的单行har-har。您的issubset测试应该使用字符串数字,而不是整数,因为集合包含strn中的字符。您所需要的就是设置trn.issubset'35'为。issubset将接受任何iterable。为什么即使当前数字不是3或5,它也总是正确的?假设您有一个数字x。要么等于3,要么不是。如果它等于3,那么x!=5是真的。如果不是,那么x!=3是真的。其中至少有一个总是正确的,所以x!=3或x!=5总是正确的。@MohammadAreebSiddiqui:如果数字是3,那么数字!=5是真的。如果数字是5,那么数字!=3是真的。由于or的计算结果为true,只要其测试结果为true,它将始终计算为true。并且在'35'中为strn中的数字返回alldigit将是一个不错的单行har-har。issubset测试应使用字符串数字,而不是整数,因为集合包含strn中的字符。您所需要的就是设置trn.issubset'35'为。issubset将接受任何iterable。为什么即使当前数字不是3或5,它也总是正确的?假设您有一个数字x。要么等于3,要么不是。如果它等于3,那么x!=5是真的。如果不是,那么x!=3是真的。其中至少有一个总是正确的,所以x!=3或x!=5总是正确的。@MohammadAreebSiddiqui:如果数字是3,那么数字!=5是真的。如果数字是5,那么数字!=3是真的。因为只要一个测试为真,or的计算结果就会为真。s中的“3”和“5”不会像你认为的那样,它的意思是s中的“3”和“5”,这总是真的。你能用一个例子来证明吗?试试14,或3等等。通常,在你的情况下,11111 5给出了真实值我想我修正了它:'3'和'5'在s中的作用与你认为的不同,它的意思是'3'和'5'在s中,这总是真实的。请你用一个例子来证明一下。试着用14或3等等。通常,在你的情况下,11111 5给出了真实值我想我修正了它:但是0呢?或负数,但没有人考虑那些被拒绝的0处理。如果你想要负数,就用abs。但是0呢?或负数,但没有人考虑那些被拒绝的0处理。如果你想要负数,就用abs。那不是缺少另一个not吗?那不是缺少另一个not吗?修复你在'353'中对If r的测试更改:不是说我喜欢f
rom int to string设置为string。如果我像'35'中的r一样编辑,它应该会修复..对吗?您已经有了一个集合,而不是将它更改为字符串并遍历所有可能的情况,您只需检查它是否是{3,5}的子集,并使用setd.issubset{3,5}.谢谢…编辑了…我没有意识到..我在测试555333和333555,因为输入r总是以35的形式出现..这就是我错过的原因..在'353'中将测试更改为if r:并不是说我喜欢从int到string再到set到string。谢谢如果我在'35'中编辑r,它应该会修复..对吗?你已经有了一组,与其将其更改为字符串并遍历所有可能性,您只需使用setd.issubset{3,5}检查它是否是{3,5}的子集。谢谢…编辑…我没有意识到..我正在测试555333和333555,因为输入r总是35..这就是我错过它的原因。。