判断二维列表中列表的和是奇数还是偶数

0 投票
3 回答
1862 浏览
提问于 2025-04-17 18:21

我刚开始学习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 个回答

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])
5

在你的偶数函数里,只检查奇数的情况,这样可以快速结束,并在最后返回 true。

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

检查奇数的情况时,反过来做就可以了。

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)

撰写回答