簡體   English   中英

Python - 在2維列表中查找所有偶數的總和

[英]Python - Find sum of all even numbers in 2 Dimensional List

問題是:

給出整數的“二維列表” - 即每個列表
它中的值是一個整數列表 - 找到所有偶數並將它們加在一起。

第一個是我的第一次嘗試,我似乎成功地使它與1列表一起工作。 然后我嘗試使用2D列表,這段代碼給我一個錯誤'int object is not subscriptible',我認為這與我的while語句有關。 任何幫助將不勝感激,謝謝!

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)

您的代碼存在多個問題。 最簡單的是使用帶有嵌套條件生成器表達式的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)

你可以試試這個:

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

你可以試試這個。 它適用於任何維度列表(不僅僅是2):

list2d=[[1,2],[2,3,4]]
result=sum([int(elem) for elem in str(list2d).replace('[','').replace(']','').split(',') if not int(elem)%2])
>>> 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

具體而言,此錯誤意味着您嘗試使用int ,就好像它是一個list

原因是您的第二個sum_even函數是為了處理2D列表而構建的,但是您在一維列表( [4,8] )而不是二維列表( [[4],[8]] )上使用它。

盡管如此,您的代碼還有另一個錯誤:

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中,對於語句,不要使用帶迭代器的索引。 結果更像是一個短語:

對於2D列表xss每個1d_list ,檢查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子列表可能有不同的大小)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM