判断二维列表中列表的和是奇数还是偶数
我刚开始学习Python,现在在做作业时遇到了一些问题。作业题目是这样的:
实现一个叫做evenrow()的函数,这个函数需要接收一个二维整数列表,如果每一行的数字加起来是偶数,就返回True;如果有任何一行的数字加起来是奇数,就返回False。
这就是我期望的结果:
evenrow([[1,3], [2,4], [0,6]])
True
evenrow([[1,3], [3,4], [0,5]])
False
这是我现在写的函数:
def evenrow(lst):
mysum = 0
for i in lst:
mysum += sum(i)
if mysum % 2 == 0:
return True
else:
if mysum %2 ==1:
return False
不知道为什么,我的函数无论输入什么都一直返回True。我是不是漏掉了什么?如果能给我一些提示,我会非常感激!
3 个回答
一旦你在一个方法里使用了return
,就结束了这个方法,不能再“回到”循环里了。相反,如果你发现了一行是奇数,就应该返回False
,因为一旦找到一个奇数,就不需要再检查其他行了。否则,如果你检查完所有行都没有发现奇数,那就说明它们都是偶数,可以返回True
。
def evenrow(lst):
for i in lst:
if sum(i) % 2 == 1:
return False
return True
或者,如果你想挑战一下自己,看看能不能理解这个超级简短的列表推导式是怎么工作的:
def evenrow(lst):
return not len([x for x in lst if sum(x) % 2])
在你的偶数函数里,只检查奇数的情况,这样可以快速结束,并在最后返回 true。
def even2d(list2d):
for sub_list in list2d:
if sum(sub_list)%2 == 1:
return False
return True
检查奇数的情况时,反过来做就可以了。
我觉得Joran Beasley的回答最适合你现在的知识水平,但看看更“pythonic”的、更高级的解决方法也是值得的:
def even2d(list2d):
return all(sum(row) % 2 == 0 for row in list2d)
你可能一开始不太明白,但我可以给你解释一下。
首先,all
函数的作用是,如果序列中的每个值都为真,它就返回True
。这点很明显——而且这样可以避免“反向思考”的麻烦(“所有行都是偶数,除非有一行是奇数”)。关键是,中间那个表达式是什么样的序列呢?
首先,你怎么得到一系列行的总和呢?
row_sums = []
for row in list2d:
row_sum = sum(row)
row_sums.append(row_sum)
Python允许你用列表推导式来简化这个模式:
row_sums = [sum(row) for row in list2d]
当然,sum(row)
这个表达式可以更复杂,比如sum(row) % 2 == 0
:
row_evens = [sum(row) % 2 == 0 for row in list2d]
所以:
def even2d(list2d):
row_evens = [sum(row) % 2 == 0 for row in list2d]
return all(row_evens)
现在我们快完成了,但你可以通过使用生成器表达式让它更好,这样你就得到了一个“懒惰列表”,其中的值只有在需要时才会被计算。你只需要把方括号换成圆括号就可以了:
def even2d(list2d):
row_evens = (sum(row) % 2 == 0 for row in list2d)
return all(row_evens)