【问题标题】:Find The Parity Outlier Python查找奇偶校验异常值 Python
【发布时间】:2019-12-31 00:08:41
【问题描述】:
def find_outlier(lstOfints):
  for integer in lstOfints:
    #print(integer)
    if integer % 2 ==1:
      integer
    elif integer % 2 == 0:
      integer
  return integer

我不断得到错误的答案,我不知道发生了什么。 这就是问题所在:

给你一个包含整数的数组(长度至少为 3,但可能非常大)。数组要么完全由奇数组成,要么完全由偶数组成,除了单个整数 N。编写一个将数组作为参数并返回这个“异常值”N 的方法。

【问题讨论】:

  • 你必须使用return
  • 您必须在for-loop 之后使用return - 检查所有值并找到N
  • 这些说明暗示您需要查看序列中的多个项目以确定哪个特定项目是异常值。你只是返回第一个。
  • 现在正确吗?在检查整数是奇数还是偶数后我放了一个返回
  • 你能解释一下你想做什么吗?你的清单是什么样的?异常值应该以什么形式返回?

标签: python


【解决方案1】:

这似乎对我有用:

def find_outlier(lstOfints):
    if lstOfints[0] % 2 == 1 and lstOfints[1] % 2 == 1:
        for integer in lstOfints[2::]:
            if integer % 2 == 0:
                return integer
    elif lstOfints[0] % 2 == 0 and lstOfints[1] % 2 == 0:
        for integer in lstOfints[2::]:
            if integer % 2 == 1:
                return integer
    else:
        if lstOfints[0] % 2 == lstOfints[2] % 2:
            return lstOfints[1]
        else:
            return lstOfints[0]

首先,我想看看这个列表是全是赔率还是全是偶数,排除异常值。然后,如果它是偶数,它会遍历列表寻找奇数,如果列表都是奇数,则相同。但是,如果异常值在前两个数字中,则它会通过将模数与列表中第三个数的模数进行比较来检查异常值是第一个数还是第二个数。

【讨论】:

  • 问题说,“它的长度至少为 3,但可能非常大”。你只检查前三个吗?
  • 它检查前两个数字以查看它们是偶数还是奇数或混合。如果它们相同,那么它会检查列表的其余部分是否存在异常值。但是,如果它们不同,则会将它们与第三个数字进行比较,以查看哪个是异常值,因为问题表明整个列表中只有一个异常值。
  • 对。该列表将是“至少 3 个”。可能有 4、5、6+。你也想为此编写代码。
  • 没错。这就是第一个 if 和 elif 语句中 for 循环的用途
  • 他使用 for 循环来避免硬编码,所以一切都很好并且自动化
【解决方案2】:

pythonic 的答案可能是这样的:

def find_outlier(lst):
  mods = [n % 2 for n in lst]
  return lst[mods.index(0)] if sum(mods[:3]) > 1 else lst[mods.index(1)]

print(find_outlier([5, 31, 57, 45, 9, 17, 8, 37, 123, 67])) # --> 8

print(find_outlier([4, 30, 56, 44, 8, 16, 7, 36, 122, 66])) # --> 7

说明:首先为提供的列表中的所有n 创建所有n % 2 的列表。然后,您只需检查这个新列表的前 3 个元素的总和,就可以知道异常值是奇数还是偶数。然后找到异常余数的索引(0或1)并从第一个列表中返回相应的整数...

【讨论】:

    【解决方案3】:

    您的代码中有很多地方需要更改,因此我将尝试逐步更改它以使其最终正常工作。

    从问题中运行函数

    嗯,我在这里测试了你的代码,我明白它为什么会让人困惑。我有这个脚本:

    def find_outlier(lstOfints):
      for integer in lstOfints:
        #print(integer)
        if integer % 2 ==1:
          integer
        elif integer % 2 == 0:
          integer
      return integer
    
    print(find_outlier([1,3,4,5]))
    print(find_outlier([1,2,3,4]))
    

    ...如果我运行它,我们会得到:

    $ python disparity.py
    5
    4
    

    它只是打印最后一个数字!为什么会这样?

    为什么总是打印列表中的最后一个数字?

    好吧,因为你只是在函数结束时返回。您希望该函数从if 语句内部返回,但您没有使用return 命令。很容易解决:

    def find_outlier(lstOfints):
      for integer in lstOfints:
        if integer % 2 ==1:
          return integer
        elif integer % 2 == 0:
          return integer
      return integer
    
    print(find_outlier([1,3,4,5]))
    print(find_outlier([0,2,3,4]))
    

    所以现在我们运行它并得到

    $ python disparity.py
    1
    0
    

    现在它只是返回 first 元素!

    为什么现在总是打印列表中的第一个数字?

    它会打印第一个元素,因为您的 if 语句是互补的。给定 any 元素,无论其奇偶性如何,它模 2 将为 0 或 1。如果为零,则第一个 if 返回;如果是1,则返回第二个!因为它适用于所有元素,所以它适用于第一个元素,所以函数在第一次迭代时结束。

    这不是你想要的算法。你想要的是首先知道哪个奇偶校验是异常值,然后然后寻找异常值。

    如果我不知道哪个数字是异常值,如何发现哪个奇偶校验是异常值?

    由于列表至少包含三个元素,这很容易:我们考虑两种情况。

    • 第一种情况是,异常值是前三个元素之一。在这种情况下,我们将有一个异常奇偶校验和两个“正常”奇偶校验。
    • 第二种情况是,异常值不是前三个元素之一。在这种情况下,我们将有三个相等的奇偶校验,异常值将是相反的。

    所以,如果我们计算前三个值中偶数和奇数的个数,我们知道数字较少的奇偶校验是异常值。

    • 如果偶数多于奇数(两个偶数和一个奇数,或三个偶数且没有奇数),则我们知道异常值是奇数。
    • 如果奇数多于偶数,我们就知道异常值是偶数。

    现在,如何在代码中做到这一点?

    为此,我将在下面编写一些代码,然后放在一起,给我们答案。首先,我创建了两个变量来计算偶数和奇数(一开始是 0)。

      even_numbers = 0
      odd_numbers = 0
    

    然后,我看看第一个元素是否是偶数。如果是这样,我增加偶数的计数器:

      if listOfints[0] % 2 == 0:
          even_numbers = even_numbers + 1
      else:
          odd_numbers = odd_numbers + 1
    

    然后我对第二个和第三个元素做同样的事情:

      if listOfints[1] % 2 == 0:
          even_numbers = even_numbers + 1
      else:
          odd_numbers = odd_numbers + 1
    
      if listOfints[2] % 2 == 0:
          even_numbers = even_numbers + 1
      else:
          odd_numbers = odd_numbers + 1
    

    如果偶数比奇数多,我们就知道异常奇偶校验是奇数(即异常除以 2 的其余部分是 1);如果奇数比偶数多,则异常奇偶校验为偶数(即其余为零)

      if even_numbers > odd_numbers:
          outlier_parity = 1
      else:
          outlier_parity = 0
    

    所以,现在我知道异常值是偶数还是奇数,我同意。但我想知道数字是多少!

    既然我们确实知道异常值的奇偶性,我们只需要寻找它:

      for integer in lstOfints:
        if integer % 2 == outlier_parity:
          return integer
    

    捆绑在一起,这是我们的新功能:

    def find_outlier(lstOfints):
      even_numbers = 0
      odd_numbers = 0
    
      if lstOfints[0] % 2 == 0:
          even_numbers = even_numbers + 1
      else:
          odd_numbers = odd_numbers + 1
    
      if lstOfints[1] % 2 == 0:
          even_numbers = even_numbers + 1
      else:
          odd_numbers = odd_numbers + 1
    
      if lstOfints[2] % 2 == 0:
          even_numbers = even_numbers + 1
      else:
          odd_numbers = odd_numbers + 1
    
      if even_numbers > odd_numbers:
          outlier_parity = 1
      else:
          outlier_parity = 0
    
    
      for integer in lstOfints:
        if integer % 2 == outlier_parity:
          return integer
    
    print(find_outlier([1,3,4,5]))
    print(find_outlier([0,2,3,4]))
    

    有效吗?让我们测试一下:

    $ python disparity.py
    4
    3
    

    哦,成功了!还不错吧? :)

    一些注意事项

    这里的代码不是最优雅的,但我在这里的主要目的是让您了解发生了什么。它可以用一个更短、更易读的函数来完成,但由于你仍在寻找基本概念,我做了一个更详细、可解释的函数,结果有点麻烦。

    【讨论】:

      【解决方案4】:

      我的解决办法是:

      def find_outlier(integers):
          odd = []
          even = []
          for i in integers:
              if i% 2 != 0:
                  odd.append(i)
              elif i% 2 == 0:
                  even.append(i)
          if len(odd) < len(even):
              return odd[0]
          else:
              return even[0]
      

      【讨论】:

        猜你喜欢
        • 2019-09-18
        • 1970-01-01
        • 2019-10-28
        • 1970-01-01
        • 1970-01-01
        • 2019-03-08
        • 1970-01-01
        • 2015-06-29
        • 2013-06-25
        相关资源
        最近更新 更多