确定2D列表中的列表总和是奇数还是偶数

时间:2013-03-08 00:45:40

标签: 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:
        mysum += sum(i)
        if mysum % 2 == 0:
            return True
        else:
            if mysum %2 ==1:
                return False

出于某种原因,无论我输入什么,我的功能都会让我真实。有什么我可以忽略的吗?任何提示都将不胜感激!

3 个答案:

答案 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])