2014-07-23 36 views
0

比我想寫達到這個目的,如果給一個函數的嵌套列表:做總和在給定的列表

t = [1,2,[2,2],[3,3]] 

我想要的功能,使T爲 [1,2,4,6]。這裏,是我的代碼在Python:

t=[1,2,[2,2],[3,3]] 

def nested_sum(t): 
    for x in t: 
     if type(t[x])=='int': 
      t[x]=t[x] 
     else: 
      t[x]=['sum(t[x])'] 
    return t 

nested_sum(t) 

我得到了

Traceback (most recent call last): 
    File "nested_sum.py", line 11, in <module> 
    nested_sum(t) 
    File "nested_sum.py", line 5, in nested_sum 
    if type(t[x])=='int': 
TypeError: list indices must be integers, not list 

我不太肯定我所犯的錯誤(或多個)錯誤信息。因爲我的邏輯是:

type(t[0])=1這是「Int」類型和type(t[2])=[2,2]這是「List」類型,我認爲這些符合「if ... else ...」語句。

任何幫助將不勝感激指出我的錯誤。提前謝謝你。

+0

'for x in t'將'x'綁定到列表中的每個* item *,而不是每個* index *。 – jonrsharpe

+0

謝謝jonrsharpe,我現在發現我的錯誤。 – nam

回答

0

您的代碼存在的問題是您正在循環列表中的項目而不是通過索引。爲了使其工作,你應該改變這樣的代碼:

def nested_sum(t): 
    for x in range(len(t)): 
     if type(t[x]) == int: 
      t[x] = t[x] 
     else: 
      t[x] = sum(t[x]) 
    return t 

還要注意inttype(t[x]) == intsum(t[x])您else子句中不應該是字符串。

+0

感謝Railslide,for-condition中的簡單更改可以使程序運行。 – nam

0

使用總和()當x是一個列表,其追加到水庫否則

t=[1,2,[2,2],[3,3]] 

def nested_sum(l): 
    res = [] 
    for x in l: 
     if type(x) == type([]): 
      res.append(sum(x)) 
     elif type(x) == type(1): 
      res.append(x) 
    return res 

nested_sum(t) 
0
def nested_sum(t): 
    for index, item in enumerate(t): 
     if type(item) == list: 
      t[index] = sum(item) 
    return t 

說明:

enumerate(t)返回(0,噸[0]),(1,T [1])等。

然後,對於中的每個item,檢查item是否爲list。如果是,則將其替換爲該列表中所有元素的總和。這在t[index] = sum(item)完成。

+0

感謝Saimadhav你的解釋函數枚舉=] – nam

4

你也可以使用isinstance把它放在一個列表理解:

[sum(x) if isinstance(x,list) else x for x in t]

[1, 2, 4, 6] 

你可以使用collection.Iterable將像元組等可迭代的工作..

t = [1,2,[2,2],[3,3],(4,5)] 

from collections import Iterable 

print [sum(x) if isinstance(x, Iterable) else x for x in t] 

[1, 2, 4, 6, 9] 

在列表理解中,如果x是一個可迭代/列表,我們添加子元素的sumelse,我們只取元素x

使用自己的代碼,你可以使用枚舉使用他們的索引來訪問列表元素:

def nested_sum(t): 
    for ind, x in enumerate(t): 
     if type(t[ind])== int: # int not "int" 
      t[ind] = x 
     else: 
      t[ind] = sum(t[ind]) 
    return t 

在代碼ind是各個子元件的指標和x是實際的子元素

+0

好,但可能更喜歡'collections.Iterable'比列表 – wim

+0

@wim是我同意,我要補充一點。 –

+0

感謝Padraic爲您詳細解釋。由於我正在閱讀第10章的「思考Python」,在我現階段對於我來說編程似乎太過先進。如果我獲得更多有關Python的知識,我將在稍後參考您的解釋。謝謝。 – nam

0

答案是:

def nested_sum(mixed_list): 
    res = list() 
    for element in mixed_list: 
     try: 
      a = sum(element) 
     except TypeError: 
      a = element 
     res.append(a) 
    return res 

如果列表包含數字和列表數字。