【问题标题】:Counting the number of 6's and 8's in a range计算一个范围内的 6 和 8 的数量
【发布时间】:2021-12-24 03:54:12
【问题描述】:

我想创建一个代码来计算 6 和 8 在一个范围内出现的次数,但我不想计算同时包含 6 和 8 的任何数字。到目前为止,我有这样的事情:

def countnums(a) :
    count = 0 
    for x in range(a):
        if 6 and 8 in a:
            count -= 1
        elif 6 in a:
            count += 1
        elif 8 in a:
            count += 1
        return count

countnums(88)

但是我不确定我哪里出了问题(对不起,我对 Python 很陌生)。任何帮助以及对教程的任何推荐都将不胜感激!

【问题讨论】:

  • 你能解释一下同时包含6和7的数字是什么意思吗?请提供一些示例。

标签: python loops boolean counter


【解决方案1】:

有几个问题:

  • 您的要求指定 6 和 7,但您的代码查看 6 和 8

  • 您正在使用x 遍历范围,但您的所有条件都在查看a

  • in 运算符无法找到整数中的数字,因此if 6 in a 将不起作用。您需要将其作为字符串处理(并使用 x):if '6' in str(x)

  • 6 and 8 in a 这样的组合条件不会按您期望的方式工作。您必须将其分解为与and 一起加入的两个比较:例如if '6' in str(x) and '8' in str(x)

  • 因为您在合并后使用elif 进行单独的in 检查,所以您不需要从计数中减去1(计数不会受到其他条件的影响)。

  • 只有在循环完成后才需要返回计数(您的缩进使其过早结束

这是一个修订版:

def countnums(a) :
    count = 0 
    for x in range(a):
        has6 = '6' in str(x)
        has8 = '8' in str(x)
        count += has6 ^ has8  # Exclusive OR (True counts as 1, False as 0)
    return count

顺便说一句,您确实意识到 countnums(88) 将处理从 0 到 87 的数字,对吗?

【讨论】:

    【解决方案2】:

    这里有很多地方你弄错了。

    首先,您要做的是检查 0 和 a 之间的每个数字 x 是否包含 6 或 8 作为数字。因此,您应该在每个循环周期中测试的数字是 x 而不是 a。此外,return 语句不应在循环内,否则您的函数仅在一个循环周期后返回。这给了我们

    def countnums(a) :
        count = 0 
        for x in range(a):
            if 6 and 8 in x:
                count -= 1
            elif 6 in x:
                count += 1
            elif 8 in x:
                count += 1
        return count
    
    countnums(88)
    

    其次,您使用了条件表达式(x 中的 6)。 "in" 是一个运算符,它可以接受不同类型的操作数。例如 (a in [5,6,7]) 仅当 a 等于列表的元素时返回 true,并且 ("hello" in "hello, world") 仅当左操作数是正确的那一个。现在您使用 (8 in x) 来表示“数字 8 以数字 x 的十进制形式出现”。不幸的是,没有为整数操作数定义运算符 in,因此 (8 in x) 是不正确的。你可以做的就是用字符串来表达这一点,str(x) 给你 x 的十进制字符串表示,所以你可以做(​​str(x) 中的“8”)。 这给了我们:

    def countnums(a) :
        count = 0 
        for x in range(a):
            if '6' and '8' in str(x):
                count -= 1
            elif '6' in str(x):
                count += 1
            elif '8' in str(x):
                count += 1
        return count
    
    countnums(88)
    

    第三,你在 str(x) 中写了 ('6' 和 '8')。不幸的是,python 理解为 ('6') 和 ('8' in str(x)),并且知道 '6' 被评估为真(非空字符串始终为真),python 从你的表达式中理解的只是(str(x)中的'8') 表达你想要表达的正确方法是写(str(x)中的'6'和str(x)中的'8') 纠正这一点,我们得到:

    def countnums(a) :
        count = 0 
        for x in range(a):
            if '6' in str(x) and '8' in str(x):
                count -= 1
            elif '6' in str(x):
                count += 1
            elif '8' in str(x):
                count += 1
        return count
    
    countnums(88)
    

    最后,当您使用 elif 语句时,仅当前一个语句被评估为假时才会评估它们。因此,在您的情况下,例如,对于 x 为 268,第一个 if 语句被评估为 true,计数减少,但由于我们执行了第一个 if 块,因此后两个甚至不会被评估,因此计数不会增加两次。 要纠正这个问题,您必须使用三个单独的 if 语句:

    def countnums(a) :
        count = 0 
        for x in range(a):
            if '6' in str(x) and '8' in str(x):
                count -= 1
            if '6' in str(x):
                count += 1
            if '8' in str(x):
                count += 1
        return count
    
    countnums(88)
    

    此时程序运行。但是我们可以做一个额外的简化:python 中的布尔值可以作为一个数字来操作。例如,False 等于 0,True+True 等于 2,True+False 等于 1。 所以我们能做的是:

    def countnums(a) :
        count = 0 
        for x in range(a):
            if ('6' in x) + ('8' in x) == 1:
                count += 1 
        return count
    
    countnums(88)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多