python - 递归地展平 Python 中的不规则列表列表

标签 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]

许多测试用例都存在这个问题。 然后我在 python tutor 中检查了我的代码,发现在每次返回列表 t 时执行 if 语句后,最后当函数停止时它返回最后编辑的列表 t.

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

最佳答案

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

>>> 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]

关于python - 递归地展平 Python 中的不规则列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35415797/

相关文章:

python - 尝试提取特定 div 和子 div 下的数据

python - 迭代3个文件并在python中生成第三个文件的最佳方法

python - 错误: can only concatenate list (not "int") to list

python - 通过Python调用外部程序并将输出传递到stdout

python - 压缩目录目标

python - Cython build 找不到 C++11 STL 文件 - 但仅当从 setup.py 调用时

python - 两个文件的 python 'open' 中的模拟

python - 在python中的while循环中更新 "To:"电子邮件 header

python - 我正在通过 python 中的解析器读取文件,但它不起作用

python - pip.main 安装失败,显示 'module' 对象没有属性 'main'