2017-02-13 43 views
-2

我不知道我的代碼有什麼問題。我不斷收到無限循環錯誤。 我的代碼是:我的python列表展平代碼有什麼問題?

def flatten(aList):   
    x = 0 
    while any_list_in(aList): 
     fList = [] 
     for i in aList: 
      fList.append(i) 
      aList = fList 
    else: 
     return aList 

aList = [[1,'a',['cat'],2],[[[3]],'dog'],4,5] 
def any_list_in(obj): 
    return any(isinstance(item, list) for item in obj) 
flatten(aList) 
+0

你能提供更多的細節嗎? – MichaelMMeskhi

+0

您的預期產量是多少? 'itertools.chain'有什麼問題?你的遞歸也在哪裏? –

+0

你試圖做什麼魔鬼......?不要只是去嘗試[pythontutor](http://pythontutor.com/visualize.html#mode=edit)它會幫助你看到它出錯的地方。 –

回答

0

這可能是你想要的。 「flatten」創建一個「新列表」並使用幫助函數遞歸地將原始列表平鋪到新列表中。

def flatten_impl(item, newlist): 
    if type(item) == list: 
     for i in item: 
      flatten_impl(i, newlist) 
    else: 
     newlist.append(item) 

def flatten(aList): 
    newlist = [] 
    flatten_impl(aList, newlist) 
    return newlist 
0

這裏有一個flatten_list功能,保留排序,並支持任意嵌套列表,以及非列表項:

def flatten_list(obj): 
    flat_list = [] 
    for item in obj: 
     if isinstance(item, list): 
      flat_list += flatten_list(item) 
     else: 
      flat_list.append(item) 
    return flat_list 

輸出:

>>> aList = [[1, 'a', ['cat'], 2], [[[3]], 'dog'], 4, 5, [[[6,7],8],9]] 
>>> flatten_list(alist) 
[1, 'a', 'cat', 2, 3, 'dog', 4, 5, 6, 7, 8, 9] 
1

我不打算嘗試診斷代碼中的錯誤,但這裏是一個備用解決方案。

我會使用yield建立一個返回值,而不需要將它們添加到任何類型的列表中。如果您在進行檢查時不需要功能any_list_in。如果它是一個列表,那麼你使用遞歸來處理該列表,否則只是從當前迭代中產生每個值。

def flatten(iterable): 
    for i in iterable: 
     if isinstance(i, list): 
      # python 3.4+ can take out the loop 
      #yield from flatten(i) 
      for f in flatten(i): 
       yield f 
     else: 
      yield i 

aList = [[1,'a',['cat'],2],[[[3]],'dog'],4,5] 

print(list(flatten(aList))) 

如果您不能使用yield(可憐的你),那麼你只需要建立值的列表,並返回(左作爲練習閱讀器)。

+1

我比這更喜歡這個答案,因爲發電機比列表更靈活。另外,我不知道'從'產量! – daveruinseverything

+1

@daveruinseverything如果你想看到一個關於從'產量'的好話題,請查看一些david beasleys concurrency [講座](https://www.youtube.com/watch?v=MCs5OvhV9S4)。 –