以递归方式在Python中展平不规则的列表列表

时间:2016-02-15 17:47:07

标签: python python-2.7

我搜索并发现同一标题的问题也是(here here here here here)但我并不是这么想的。我遇到了这个问题:

编写一个函数来展平列表。该列表包含其他列表,字符串或整数。

我的代码是

t=[]
def flatten(aList):
    for i in aList:
        if type(i) !=list:
             t.append(i)
        else:
             flatten(i)

    return t     

但是当我检查测试用例的代码时:

  1. flatten([[1], [1]]):检查器告诉我输出为[1, 1, 1, 1]但是在codeskulptor中我得到了正确的输出[1, 1]
  2. flatten([[[1]], [[[5]]]]):检查器告诉输出为[1, 1, 1, 1, 1, 2, 3, 3, 2, 1, 0, 4, 5, 6, 7, 1, 5],但在codeskulptor中告诉[1, 5]
  3. 许多测试用例都存在此问题。 然后我在python导师中检查了我的代码,发现每次返回列表t后执行if语句,并在函数停止时最后执行,返回最后编辑的列表t

    我如何解决这个问题请帮助我这个,是的我是python的新手,并且对itertools,lambda函数用法,生成器等一无所知。所以请在我能理解的上下文中告诉我。< / p>

1 个答案:

答案 0 :(得分:4)

您的代码依赖于全球;如果检查程序两次调用您的函数,它将收到比预期更长的列表:

>>> t = []
>>> def flatten(aList):
...     for i in aList:
...         if type(i) !=list:
...              t.append(i)
...         else:
...              flatten(i)
...     return t
...
>>> flatten([1, 1])
[1, 1]
>>> flatten([1, 1])
[1, 1, 1, 1]
>>> t  # your global, still holding all those values:
[1, 1, 1, 1]

不要使用全局变量。使用本地列表,并使用递归调用的结果扩展它:

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

请注意,我切换到使用isinstance()来测试类型。此版本不会受到共享状态泄漏到下一个调用中的影响:

>>> def flatten(aList):
...     t = []
...     for i in aList:
...         if not isinstance(i, list):
...              t.append(i)
...         else:
...              t.extend(flatten(i))
...     return t
...
>>> flatten([1, 1])
[1, 1]
>>> flatten([1, 1])
[1, 1]
>>> flatten([[[1]], [[[5]]]])
[1, 5]
>>> flatten([1, 1, [42, 81]])
[1, 1, 42, 81]