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的方法。
答案 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 元素!
它打印第一个元素,因为您的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]