2017-10-05 48 views
-1

我正在嘗試使用此代碼來壓扁我的列表。通過扁平化我的意思是將像'int'對象不是可下載的(試圖壓扁列表)?

[1,[2], [[[[3]]]],4] 

列表爲

[1,2,3,4] 

這裏是我的代碼

i = 0 

def flatten(aList): 
    ''' 
    aList: a list 
    Returns a copy of aList, which is a flattened version of aList 
    ''' 
    global x 
    x = [] 

    def check(L): 
     global i 
     if type(L[i]) != list: 
      x.append(L[i]) 
      i += 1 
      return check(aList[i]) 
     else: 
      return check(L[i]) 

    return check(aList)` 

,我不斷收到此錯誤

Traceback (most recent call last): 

    File "<ipython-input-87-ee05c7b1d059>", line 1, in <module> 
    flatten(l) 

    File "/Users/ashwin/.spyder-py3/untitled1.py", line 20, in flatten 
    return check(aList) 

    File "/Users/ashwin/.spyder-py3/untitled1.py", line 18, in check 
    return check(L[i]) 

    File "/Users/ashwin/.spyder-py3/untitled1.py", line 16, in check 
    return check(aList[i]) 

    File "/Users/ashwin/.spyder-py3/untitled1.py", line 13, in check 
    if type(L[i]) != list: 

TypeError: 'int' object is not subscriptable 

這是什麼我需要改變?

+0

這應該如何工作?你爲什麼使用全局的'x'?你爲什麼使用全局的'i'?你爲什麼在一個情況下調用'check(aList [i])'而在另一個情況下調用(L [i])''? – khelwood

+0

它看起來像'check()'是遞歸的,但它不能是因爲沒有基本的情況下,你只是返回。 (加全局和遞歸不能很好地混合)。 – quamrana

+0

關於這個問題有多個問題,你之前做過搜索嗎?我們解決SO問題,而不是代碼評論。很好的例子! :) –

回答

4

可以簡化爲:

def flatten(a_list): 
    x = [] 
    def check(l): 
     # Note: check l, not l[i] because l can be anything in the recursive calls 
     if not isinstance(l, list): 
      x.append(l) 
     else: 
      for sub in l: 
       check(sub) 
    check(a_list) 
    return x 

> flatten([1, 2, [3, 4, [[5], 6]]]) 
[1, 2, 3, 4, 5, 6] 

還有就是l[i]沒有硬性訪問,因爲你從來沒有l是什麼。整數會引發您遇到的錯誤。這也擺脫了對全局變量的需求。

+0

哦,我沒有注意到它是一個內部函數,derp – Felk