解压缩n级嵌套列表

时间:2018-08-29 14:14:50

标签: python python-3.x

假设我有一个列表

[(1,2), (3, 4)].

如果列表中的所有元素都是元组,我将打印1 + 2和3 + 4。 但是,如果其中任何一个元素也是一个列表,则我向内部列表的每个元素加1,然后将该内部列表的每个元素附加到父列表。 例如。

list = [(1,2), [(3, 4), (5, 6)]], 

成为

[(1, 2), (3, 4, 1), (5, 6, 1)].

同样,如果内部列表将列表作为元素,我们将重复同样的事情。 例如。

[(1,2), [(3, 4), (5, 6), [(7, 8)]]] 

首先成为

[(1,2), [(3, 4), (5, 6), (7, 8, 1)]] 

然后终于变成了

[(1,2), (3, 4, 1), (5, 6, 1), (7, 8, 1, 1)].

如何对这样的列表执行此过程,该列表的嵌套级别(如列表中的列表中的列表...)是未知的?

我用来生成此列表的代码如下:

def possible_sums(a):
    if a == 2:
        return [(1, 1)]
    list_l = list(((a - 1, 1), ))
    list_l.append(possible_sums(a-1))
    return list_l


print(possible_sums(8))

2 个答案:

答案 0 :(得分:3)

此解决方案使用嵌套生成器。我们遍历列表中的项目,检查其类型。每当我们看到list时,我们就会在该列表上递归调用flatten,并将1添加到每个输出的末尾。如果item是一个元组,我们只产生它。然后在flatten之外,我们遍历生成器以构建列表。

def flattener(lst):
    for item in lst:
        if isinstance(item, list):
            gen = flattener(item)
            for item in gen:
                yield item + (1,)
        elif isinstance(item, tuple):
            yield item


print(list(flattener([(1,2), [(3, 4), (5, 6), [(7, 8)]], [(5, 6, 7), [(1, 2)]]])))
# [(1, 2), (3, 4, 1), (5, 6, 1), (7, 8, 1, 1), (5, 6, 7, 1), (1, 2, 1, 1)]

答案 1 :(得分:1)

include('functions.php');
upload($file, $path);