我是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
出于某种原因,无论我输入什么,我的功能都会让我真实。有什么我可以忽略的吗?任何提示都将不胜感激!
答案 0 :(得分:5)
只检查偶函数中的奇数是否短路 并在最后返回
def even2d(list2d):
for sub_list in list2d:
if sum(sub_list)%2 == 1:
return False
return True
反之为检查奇数
答案 1 :(得分:3)
我认为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)
答案 2 :(得分:2)
从你的方法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])