Python 最后一个号码!为什么会这样 为什么它总是打印列表中的最后一个数字?

Python 最后一个号码!为什么会这样 为什么它总是打印列表中的最后一个数字?,python,Python,因为你只是在函数的末尾返回。您希望函数从if语句内部返回,但未使用return命令。这很容易解决: $ python disparity.py 5 4 所以现在我们运行它并获得 def find_outlier(lstOfints): for integer in lstOfints: if integer % 2 ==1: return integer elif integer % 2 == 0: return integer return i

因为你只是在函数的末尾返回。您希望函数从
if
语句内部返回,但未使用
return
命令。这很容易解决:

$ python disparity.py
5
4
所以现在我们运行它并获得

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]))
现在它只是返回第一个元素

为什么它现在总是打印列表中的第一个数字? 它打印第一个元素,因为
if
语句是互补的。给定任何元素,无论其奇偶性如何,它的模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
如果偶数多于奇数,我们知道离群奇偶性是奇数(也就是说,离群值除以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
def find_异常值(整数):
奇数=[]
偶数=[]
对于整数形式的i:
如果我是%2!=0:
奇数.附加(i)
elif i%2==0:
偶数。附加(i)
如果len(奇数)
我的解决方案是:

$ python disparity.py
4
3
def find_异常值(整数):
奇数=[]
偶数=[]
对于整数形式的i:
如果我是%2!=0:
奇数.附加(i)
elif i%2==0:
偶数。附加(i)
如果len(奇数)
必须使用
return
必须在
for
之后使用
return
-循环-在检查所有值并找到
N
后,说明意味着您需要查看序列中的多个项目,以确定哪个特定项目是异常值。您刚刚返回第一个,现在正确吗?我在检查整数是奇数还是偶数后返回。你能解释一下你想做什么吗?你的清单是什么样的?异常值应该作为什么返回?您必须使用
return
您必须在
之后使用
return
for
-循环-在检查所有值并找到
N
后,说明暗示您需要查看序列中的多个项目,以确定哪个特定项目是异常值。您刚刚返回第一个,现在正确吗?我在检查整数是奇数还是偶数后返回。你能解释一下你想做什么吗?你的清单是什么样的?异常值应该作为什么返回?问题是,“它的长度至少为3,但可能非常大”。你只检查前三个吗?它检查前两个数字,看它们是偶数还是奇数或混合数。如果它们相同,那么它会检查列表的其余部分是否存在异常值。但是,如果它们不同,那么它会将它们与第三个数字进行比较,以确定哪一个是异常值,因为问题表明整个列表中只有一个异常值。对。名单将是“至少3个”。可能有4,5,6+。你也要为此编写代码,没错。这就是for循环在第一个if和elif语句中的作用。她使用for循环来避免硬编码,因此一切都很好并且自动化。问题是,“它的长度至少为3,但可能非常大”。你只检查前三个吗?它检查前两个数字,看它们是偶数还是奇数或混合数。如果它们相同,那么它会检查列表的其余部分是否存在异常值。但是,如果它们不同,那么它会将它们与第三个数字进行比较,以确定哪一个是异常值,因为问题表明整个列表中只有一个异常值。Righ
  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
  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
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]