Python - 在2维列表

时间:2017-09-28 23:07:12

标签: python python-3.x

问题是:

给出"二维列表"整数 - 即每个列表 它中的值是一个整数列表 - 找到所有偶数并将它们加在一起。

第一个是我的第一次尝试,我似乎成功地使用了1个列表。然后我尝试使用2D列表,这段代码给了我一个错误∫ int object is not subscriptible'我认为这与我的同时声明有关。任何帮助将不胜感激,谢谢!

def sum_even(xss):
    result = 0
    for item in xss:
        if item % 2 == 0:
            result = result + item
    return result
ans = sum_even([4,8])
print (ans)

def sum_even(xss):
    result = 0
    n = 0
    i = 0
    j = 0
    while xss[i][0] in xss:
        if xss[i][0] % 2 == 0:
            result = result + xss [i][0]
        while xss[0][j] in xss:
            if xss[0][j] % 2 == 0:
                result = result +xss[0][j]
    i +=1   
    return result
ans = sum_even([4,8])
print (ans)

5 个答案:

答案 0 :(得分:3)

您的代码存在多个问题。最简单的就是使用  sum具有嵌套的条件生成器表达式:

def sum_even(xss):
    return sum(x for sub_lst in xss for x in sub_lst if not x % 2)

嵌套for表达式的范围有时似乎是反直觉的。这大致相当于:

def sum_even(xss):
    result = 0
    for sub_lst in xss:
        for x in sub_lst:
            if not x % 2:
                result += x
    return result

对于任意嵌套的整数列表,您必须使用递归:

def sum_even(xss):
    if isinstance(xss, int):
        return (not xss % 2) * xss  # the bool expr is neatly coerced to 1 or 0 ;)
    return sum(sum_even(sub) for sub in xss)

答案 1 :(得分:3)

你可以试试这个:

import itertools
even_numbers = sum(i for i in itertools.chain.from_iterable(first_list) if i%2 == 0)

答案 2 :(得分:1)

你可以试试这个。它适用于任何维度列表(不仅仅是2):

ng -v

答案 3 :(得分:1)

>>> a=[[1,2],[3,4],[5,6]]
>>> reduce(lambda s,x:s+x,[i for l in a for i in l if not i%2],0)
12

没有itertools并只使用列表理解。

非常简单,感谢@ juanpa.arrivillaga,更简单的版本

>>> a=[[1,2],[3,4],[5,6,7,8]]
>>> sum([i for l in a for i in l if not i%2])
20

答案 4 :(得分:1)

具体而言,此错误表示您尝试使用list,就好像它是sum_even一样。

原因是您的第二个[4,8]函数是为了处理2D列表而构建的,但您在一维列表([[4],[8]])上使用它而不是在2D列表上{{1 }})。

尽管如此,您的代码还有另一个错误:

def sum_even(xss):
    result = 0
    n = 0
    i = 0
    j = 0
    while xss[i][0] in xss:
        if xss[i][0] % 2 == 0:
            result = result + xss [i][0]
        while xss[0][j] in xss:
            if xss[0][j] % 2 == 0:
                result = result +xss[0][j]
    i +=1   
    #there is no update for j
    return result

在python中,for语句不要使用带迭代器的索引。结果更像是一个短语:

对于2D列表1d_list中的每个xss,请检查elements。如果element为偶数,请将其添加到result

def sum_even(xss):
    result = 0
    for 1d_list in xss:
        for element in 1d_list:
            if element%2 == 0:
                result = result + element
    return result

这样你就不会对列表的长度做出任何假设(每个1D子列表可能有不同的大小)。