如何将python中的嵌套列表解压缩到子列表?

时间:2015-10-15 04:16:53

标签: python list

假设我的列表是:

[ [1,2,3,4], [ [[5], [6]], [7] ]]

解压后,我想获得[1,2,3,4], [5], [6], [7]

如何以较低的时间复杂度做到这一点?

5 个答案:

答案 0 :(得分:3)

linked duplicate完全展平了一个迭代。您只需稍微调整即可使流程提前一步停止:

import collections
def flattish(l):
    for el in l:
        if isinstance(el, collections.Iterable) and not isinstance(el, str):
            if any(isinstance(e, collections.Iterable) for e in el):
                for sub in flattish(el):
                    yield sub
            else:
                    yield el
        else:
            yield [el]

any(...将检查该iterable是否包含任何迭代。这会使[1, [2, 3]]之类的内容变得扁平化,但会保留[5]。此外,yield [el]确保任何非迭代都将包含在list中,因此您的结果将是仅包含list的{​​{1}},其中一些可能只有一个元素。

答案 1 :(得分:2)

使用正则表达式的另一种方式:

>>> import re
>>> x = [[1, 2, 3, 4], [[[5], [6]], [7]]]
>>> eval(re.sub(r'([][])\1+', '\\1', str(x)))
([1, 2, 3, 4], [5], [6], [7])

@ TigerhawkT3对这个x的答案更快,每个循环28.9μs对每个循环41.8μs

所以只是为了好玩

import json
json.loads(re.sub(r'([][])\1+', '\\1', str(x)))

将正则表达式恢复到每个循环22.1μs

答案 2 :(得分:0)

您可以尝试使用re

import re
x=[ [1,2,3,4], [ [[5], [6]], [7] ]]
print map(lambda x:map(int,re.findall(r"\d+(?=.*\])",x)),re.findall(r"\[[^\[\]]*\]",str(x)))

输出:[[1, 2, 3, 4], [5], [6], [7]]

答案 3 :(得分:0)

您可以尝试:

>>> final_list = []
>>> def make_single(input_list):
    final_list_inside = []
    for i in input_list:
        if any(isinstance(el, list) for el in input_list):
            make_single(i)
        else:
            final_list_inside.append(i)
    if(len(final_list_inside) != 0):
        final_list.append(final_list_inside)


>>> make_single([[1, 2, 3, 4], [[[5], [6]], [7]]])
>>> final_list
[[1, 2, 3, 4], [5], [6], [7]]

答案 4 :(得分:0)

您可以递归检查好的列表:好的列表是那些不包含列表的列表。每个列表仅访问一次。

def prettyflat(ll):
    pf=[]
    def good(ll):
        isgood = isinstance(ll,list) and  all([not good(l) for l in ll])
        if isgood : u.append(ll)
        return isgood
    good(ll)
    return pf

输出:[[1, 2, 3, 4], [5], [6], [7]]