2017-02-13 37 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)。 –