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

2024-09-30 20:22:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我搜索后发现标题相同的问题也是(hereherehereherehere),但我没有问这个问题。我遇到了一个问题:

编写一个使列表变平的函数。该列表包含其他列表、字符串或整数。在

我的密码是

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中的代码,发现在每次执行if语句之后,list t返回,最后当函数停止时,它返回最后编辑的列表t。在

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


Tags: 函数字符串代码密码标题列表if测试用例
1条回答
网友
1楼 · 发布于 2024-09-30 20:22:30

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

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

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

^{pr2}$

注意,我切换到使用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]

相关问题 更多 >