将来自不同子列表的数字组织到一个列表中

时间:2014-05-06 10:48:09

标签: python list python-3.x recursion sublist

我正在尝试编写一个“扁平化”列表的代码,它会获得一个包含多个数字列表的列表,并创建一个数字列表。

运行示例:

>>> flatten(1) 
[1] 
>>> flatten([]) 
[] 
>>> flatten([[[1],[2,[1]]]]) 
[1, 2, 1] 

我想以递归方式执行此操作,但由于某种原因,我的代码返回相同的列表:

def flatten(lst):
    if type(lst)==int:
        return [lst]
    elif lst==[]:
        return lst
    else:
        return [flatten(sub) for sub in lst]

3 个答案:

答案 0 :(得分:0)

您的代码中存在两个问题

  1. 而不是if type(lst)==int:,您应该写isinstance(lst, int)
  2. 您正在重建一个未包装的列表,因此您实际上必须链接各个元素而不是包含在列表中

    所以,而不是return [flatten(sub) for sub in lst],它应该是list(chain.from_iterable(flatten(sub) for sub in lst))

  3. 您的最终代码看起来像

    def flatten(lst):
        from itertools import chain
        if isinstance(lst,int):
            return [lst]
        elif lst==[]:
            return lst
        else:
            return list(chain.from_iterable(flatten(sub) for sub in lst))
    

答案 1 :(得分:0)

不使用itertools

def flatten(items):
    for elem in items:
        if isinstance(elem,list):
            for sub_elem in flatten(elem):
                yield sub_elem
        else:
            yield elem

In [8]: list(flatten([[[1],[2,[1]]]]))
Out[8]: [1, 2, 1]

答案 2 :(得分:0)

您可以使用如下参数引入结果值,并按递下方式检索值:

def flatten(l, res=[]):
    if isinstance(l,list):
        for i in l:
            flatten(i,res)
        return res
    else:
        res.append(l)
        return res

print flatten([[[1],[2,[1]]]])

输出:

[1, 2, 1]