我的python列表展平代码有什么问题?

时间:2017-02-13 02:37:55

标签: python python-3.x

我不知道我的代码有什么问题。我不断得到无限循环错误。 我的代码是:

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)

3 个答案:

答案 0 :(得分:1)

我不会尝试诊断代码中的错误,但这是另一种解决方案。

我会使用yield来构建返回值,而无需将它们添加到任何类型的列表中。如果您在进行检查时不需要函数any_list_in。如果它是一个列表,那么你使用递归来处理该列表,否则只是从当前的iterable中产生每个值。

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 :(得分:0)

这可能是你想要的。 "平坦化"创建一个新的列表"并使用辅助函数以递归方式将原始列表展平为新列表。

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

答案 2 :(得分: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]