Python 确定2D列表中的列表之和是奇数还是偶数
我是Python新手,我的家庭作业有问题。作业问题如下: 实现函数evenrow(),该函数接受一个二维整数列表,如果表中的每一行总和为偶数,则返回True;否则返回False(即,如果某一行总和为奇数) 结果应该是这样的:Python 确定2D列表中的列表之和是奇数还是偶数,python,Python,我是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
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。有什么我忽略的吗?任何提示都将不胜感激 仅检查偶数功能中的异常,以防短路 最后返回true
def even2d(list2d):
for sub_list in list2d:
if sum(sub_list)%2 == 1:
return False
return True
反之亦然,检查异常一旦从方法返回,就不能“返回”循环。相反,如果您发现一个奇数行,您应该返回
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])
我认为Joran Beasley的答案最适合你目前的知识水平,但值得一看一种更具python风格、更高层次的方法来解决这个问题:
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)
仅检查偶数函数中的奇数,仅检查奇数函数中的奇数为什么要执行
mysum+=sum(i)
?您只关心每行的总和是否为偶数。当每一行都是偶数时,所有行的运行总和总是偶数,这增加了不必要的复杂性
def even2d(list2d):
row_evens = (sum(row) % 2 == 0 for row in list2d)
return all(row_evens)