0

我是 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。有什么我忽略的吗?任何提示将不胜感激!

4

3 回答 3

5

仅检查偶函数中的奇数以短路并在最后返回 true

def even2d(list2d):
   for sub_list in list2d:
       if sum(sub_list)%2 == 1:
           return False
   return True

反之亦然以检查奇数

于 2013-03-08T00:48:27.267 回答
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)
于 2013-03-08T01:01:12.997 回答
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])
于 2013-03-08T00:52:24.247 回答