如何展平python列表?输入是列表,字符串或整数

时间:2016-07-12 14:22:11

标签: python

下面是我压缩python列表的代码。我曾尝试使用递归的概念来做同样的事情。输入是整数,字符串或列表。我所挣扎的是,我无法理解为什么我的回报会给我一个重复值列表?我该如何纠正?

copyList = []
def flatten(aList):
    for char in aList:
        if isinstance(char,int) or isinstance(char,str):
            copyList.append(char)
        else:
            char_pos = aList.index(char) + 1
            return  flatten(char) + flatten(aList[char_pos:len(aList)]) 
    print copyList
    return copyList

我的输出在获得正确的输出方面是正确的,但返回似乎给了我重复列表几次。无法理解出了什么问题!!

  

此处的示例输出:展平([1,' a',2,[[' alpha']],3,4])

     

[1,' a',2,' alpha'] [1,' a',' alpha'] [ 1,' a',2,' alpha',3,4]

     

Out [2] :[1,' a',2,' alpha',1,' a',2 ,' alpha',' a',2,' alpha',   3,4]

3 个答案:

答案 0 :(得分:2)

def flatten_list(a, result=None):
    """ Flattens a nested list. """
    if result is None:
        result = []

    for x in a:
        if isinstance(x, list):
            flatten_list(x, result)
        else:
            result.append(x)
    return result

print flatten_list([1,'a',2,[['alpha']],3,4])

答案 1 :(得分:1)

您错误地实现了递归。您必须初始化函数内的copyList,然后在else子句中附加到它:

def flatten(aList):
    copyList = []
    for char in aList:
        if isinstance(char,int) or isinstance(char,str):
            copyList.append(char)
        else:
            char_pos = aList.index(char) + 1
            return copyList + flatten(char) + flatten(aList[char_pos:len(aList)]) 
    return copyList

答案 2 :(得分:0)

无需手动搞乱列表:

def iflatten(seq):
    for item in seq:
        if isinstance(item, list):
            for subitem in iflatten(item):
                yield subitem
        else:
            yield item

def flatten(seq):
    return list(iflatten(seq))

与写作时页面上的其他解决方案一样,它只处理非循环列表。

编辑:print语句让我觉得OP使用的是Python 2,所以我用嵌套的for循环替换了yield from表达式。