[英]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.