您的代码中有很多地方需要更改,因此我将尝试逐步更改它以使其最终正常工作。
从问题中运行函数
嗯,我在这里测试了你的代码,我明白它为什么会让人困惑。我有这个脚本:
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
哦,成功了!还不错吧? :)
一些注意事项
这里的代码不是最优雅的,但我在这里的主要目的是让您了解发生了什么。它可以用一个更短、更易读的函数来完成,但由于你仍在寻找基本概念,我做了一个更详细、可解释的函数,结果有点麻烦。