在Python中列出嵌套列表中的项

在Python中列出嵌套列表中的项,python,list,recursion,Python,List,Recursion,可能重复: 我想要一个解决方案来列出/打印嵌套列表中的所有项目(具有任意嵌套级别)。以下是我的想法: items = [] def getitems(mylist): for item in mylist: if type(item) is list: getitems(item) else: items.append(item) return items 样本输出: foo=['foo','ba

可能重复:

我想要一个解决方案来列出/打印嵌套列表中的所有项目(具有任意嵌套级别)。以下是我的想法:

items = []
def getitems(mylist):
    for item in mylist:
        if type(item) is list:
            getitems(item)
        else:
            items.append(item)
    return items
样本输出:

foo=['foo','bar',['foo','bar','baz'],'spam',['ham','eggs','salami']]

In [8]: getitems(foo)
Out[8]: 
['foo',
 'bar',
 'foo',
 'bar',
 'foo',
 'bar',
 'baz',
 'spam',
 'ham',
 'eggs',
 'salami']

这是一个好的解决方案吗?或者有更好的方法吗?

这可能有点迂腐,但您可以将累加器列表作为可选参数传递。这样,您就不会有任何全局变量处于循环状态,避免了在两次调用函数时可能出现的问题,并且在第一次调用后忘记清除它:

def getitems(mylist, acc = None):
    if acc is None: acc = []
    for item in mylist:
        if type(item) is list:
            getitems(item, acc)
        else:
            acc.append(item)
    return acc

我想你应该把它贴在上面。否则,它对我来说看起来不错。看起来不错,您可以将
类型(项目)is list
更改为
isinstance(项目,列表)
。还请注意,递归深度限制默认为1000。感谢iInstance提示!在Python中,决不能将空列表(或任何其他可变对象)作为default参数放入函数中。这是该语言最大的缺陷之一。请使用
def getitems(mylist,acc=None):
并在正文中
如果acc为None:acc=[]
。谢谢您指出这一点。我更新了我的答案。你能解释一下为什么使用可变数据作为默认参数是个坏主意吗?问题是,在定义函数时,默认参数只需计算一次。对默认参数所做的任何更改都将保留在对函数的后续调用中。谢谢!我发现他对这个问题进行了详细的讨论。