2017-08-01 14 views
0
def flatten(t): 
    list = [] 
    for i in t: 
     if(type(i) != list and type(i) != tuple): 
      list.append(i) 
     else: 
      list.extend(flatten(i)) 
    return list 

這裏是我寫壓扁列表或看起來像展開python中的列表或元組。不知道是什麼錯誤

l = ((5, (1,2), [[1],[2]])) 

當我做

flatten(l) 

我期望的元組的功能獲取清單

[5, 1, 2, 1, 2] 

但我反而得到

[5, 1, 2, [[1], [2]]] 

我真的不知道爲什麼會這樣,因爲

else: 
     list.extend(flatten(i)) 

的這部分代碼將檢索的元組的第三個元素是[1],[2]通過內部INT遞歸地調用它。我在這裏錯過了什麼?

感謝

+3

'名單= []'的問題。儘量不要隱藏像list這樣的內置名字/函數等。這隻會導致麻煩。 – MSeifert

回答

3

您分配內置list在你的函數列表實例,所以類型檢查不再正常工作的列表對象。

你應該對蓄電池列表使用不同的名字,比如,lst

def flatten(t): 
    lst = [] 
    for i in t: 
     if type(i) != list and type(i) != tuple: 
      lst.append(i) 
     else: 
      lst.extend(flatten(i)) 
    return lst 

OTOH,你可以同時使用isinstance這也保證了你正在運行的檢查對象對兩者都做檢查實際上類型:

... 
if not isinstance(i, (list, tuple)): 
    ... 
+1

使用'isinstance'會更好。這樣,如果你不小心影響了名字,你也會得到一個例外。 – MSeifert

+0

@MSeifert Yup補充說,謝謝。 –

2

你掩蓋了名list

list = [] 
... 
    if(type(i) != list and ... 

type(i)永遠不會等於[]

使用不同的名稱爲您的列表:

result = [] 

你也想用isinstance(),而不是type()平等的測試:

def flatten(t): 
    result = [] 
    for i in t: 
     if not isinstance(i, (list, tuple)): 
      result.append(i) 
     else: 
      result.extend(flatten(i)) 
    return list 

這一切都告訴你要早得多,你是不是與一個類型比較:

>>> list = [] 
>>> isinstance(['foo'], (list, tuple)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: isinstance() arg 2 must be a type or tuple of types 

拋出異常,因爲[]不是一種類型。

您可以在此處使用生成器以避免需要重複追加或擴展新的列表對象。如果你把isinstance()類型檢查迴路可以支持的非序列具有相同的功能:

def flatten(t): 
    if not isinstance(t, (list, tuple)): 
     yield t 
     return 
    for i in t: 
     yield from flatten(i) 

result = list(flatten(some_sequence_or_single_value)) 
相關問題