2017-10-05 1 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])'を呼び出し、別のケースで 'check(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が何であるかNOないためl[i]にハードのアクセス決してありません。遭遇したエラーは整数で発生します。これにより、グローバル変数の必要性もなくなります。

+0

ああ、私はそれが内部関数、derpであることに気付かなかった – Felk

関連する問題