【问题标题】:Incorrect operation of pair conditions in if\elseif\else 中对条件的错误操作
【发布时间】:2021-10-14 23:07:41
【问题描述】:

我欢迎大家。情况如下 - 在一个值从 0 到 24 的列表中,需要用 'a' 替换 3 位的倍数,用 'b' 替换 4 的倍数,第 3 位和第 4 位的倍数 - 用 ' C'。 简单的解决方案 -

y = list(range(0,25))

def some(x):
    decim_3 = 3
    decim_4 = 4
    for i in x:
        if i % decim_3 == 0:
            i = 'a'
        elif (i % decim_4) == 0:
            i = 'b'
        elif i % decim_3 == 0 and i % decim_4 == 0:
            i = 'c'
        else:
            i = i
        print(i)

解决方案根据前两个条件正确更改值,但不适用于第三个条件

some(y)

a, 1, 2, a, b, 5, a, 7, b, a, 10, 11, a, 13, 14, a, b, 17, a, 19, b, a, 22, 23, a

【问题讨论】:

  • 如果i % decim_3 == 0 为真,请考虑采用哪个分支。考虑一下i % decim_4 == 0 是否为真是否也很重要。
  • 更改顺序。如果先前的 if/elif 块被执行,elif 将不会被评估
  • 请注意,这基本上是一个 FizzBu​​zz。在Stack Overflow 和其他地方都有... 许多 解决方案和模板可用。

标签: python list replace


【解决方案1】:

显然if i % decim_3 == 0 会触发 12 的倍数,所以你需要先检查一下:

if i % 12 == 0:
    i = 'c'
elif i % 3 == 0:
    i = 'a'
elif i % 4 == 0:
    i = 'b'

这里不需要elsei = i 是无操作的。

另一种方法:

i = [i, 'a', 'b', 'c'][(not i % 3) + 2 * (not i % 4)]

not 将结果转换为bool,它是int 的子类,始终为0 或1。然后,您可以通过移动其中一个(在本例中乘以 2)将这两个测试转换为从 0 到 3 的索引位。等效索引为

(not i % 3) | ((not i % 4) << 1)

【讨论】:

    【解决方案2】:

    您应该在第一个条件中要求两者的倍数。

    这样,即使数字是两者的倍数,第一个条件也被评估为真,如果块结束则为广告。

    if i % decim_3 == 0 and i % decim_4 == 0:
            i = 'c'
        elif (i % decim_4) == 0:
            i = 'b'
        elif (i % decim_3) == 0:
            i = 'a'
        else:
            i = i
        print(i)
    

    【讨论】:

      【解决方案3】:

      原因是你使用了if/else,也就是说只要第一个条件为True,其余的条件就不会被检查了。

      所以在这里,只要你检查 12 是否可被 3 整除,它就会将 i 变成 'a' 而不会检查其他条件。

      您的解决方案是将最具体的条件放在首位(即 3 和 4 的乘数),如下所示:

      def some(x):
          decim_3 = 3
          decim_4 = 4
          for i in x:
              if i % decim_3 == 0 and i % decim_4 == 0:
                  i = 'c'
              elif i % decim_3:
                  i = 'a'
              elif (i % decim_4) == 0:
                  i = 'b'
              else:
                  i = i
              print(i)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-09
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多