查找奇偶校验离群值Python

时间:2019-12-31 00:08:41

标签: python

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的方法。

4 个答案:

答案 0 :(得分:2)

这似乎对我有用:

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]

首先,我正在查看此列表是不是所有赔率还是所有偶数都排除了异常值。然后,如果是偶数,它将遍历列表以寻找奇数,如果列表全为奇数,则相同。但是,如果离群值在前两个数字中,则会通过比较列表中第三个数字的模数来检查离群值是第一个数字还是第二个数字。

答案 1 :(得分:1)

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 % 2创建所有n的列表。然后,您只需检查此新列表的前3个元素的总和即可知道异常值是奇数还是偶数。然后找到离群余数的索引(0或1)并从第一个列表中返回相应的整数...

答案 2 :(得分:0)

您的代码中有很多要更改的地方,因此我将尝试逐步对其进行更改,以使其最终运行。

从问题中运行函数

好吧,我在这里测试了您的代码,我明白了为什么会造成混淆。我有这个脚本:

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 元素!

为什么现在总是从列表中打印 first 号码?

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

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

如果我不知道哪个奇偶校验是离群值,怎么发现?

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

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

因此,如果我们在前三个值中计算偶数和奇数的数量,我们就会知道,奇数较少的奇偶校验是离群数。

  • 如果偶数多于奇数(两个偶数和一个奇数,或者三个偶数和不奇数),那么我们知道异常值是奇数。
  • 如果奇数个数比偶数个多,我们知道离群数是偶数。

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

为此,我将在下面编写代码,然后将它们放在一起,将给我们答案。首先,我创建两个变量以计算偶数和奇数(首先为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

哦,行得通!还不错吧? :)

一些注意事项

这里的代码不是最优雅的,但是我的目的主要是让您了解正在发生的事情。可以使用更简短,更易读的功能来完成此操作,但是由于您仍在寻找基本概念,因此我做了一个更详细,可解释的功能,因此有点麻烦。

答案 3 :(得分:0)

我的解决方案是:

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]