遍历嵌套列表的列表

时间:2019-12-04 05:14:53

标签: python

我有一个嵌套列表,形式为

 A = [[a,b],[c,d]] or [[[a,b],[c,d]]] or [[[[a,b],[c,d]]]] or [[[[[a,b],[c,d]]]]] 

,依此类推。 A的这些形式不会同时出现。

无论嵌套的A多么多,我如何编写代码以剥离列表并只能获取:

[a,b] 
[c,d]

我尝试过:

def Peel_list(Features):
    try:
        for lon,lat in Features:
            print((lon,lat))
    except:
        for Feature in Features:
            for t_list in Feature:
                for A in t_list:
                    for lon,lat in A:
                        print((lon,lat))
    return()

但是它仅适用于有限的A。

5 个答案:

答案 0 :(得分:4)

通常,当我们要处理任意嵌套对象的问题时,递归是一个不错的起点。在这里,我们希望继续“挖掘”,直到遇到基本情况(在本例中为任何非列表值)。代码看起来像这样

test = [1, [3,4],[[5]], [[[6]]]]
peeled = []

def peel(myList, peeled):
    for val in myList:
        if isinstance(val, list):
            if not isinstance(val[0], list):
                peeled.append(val)
            else:
                peel(val, peeled)
        else:
            peeled.append(val)


peel(test, peeled)
print(peeled)

这将为您提供

  

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

答案 1 :(得分:3)

对于您提供的情况,一种简单的方法是使用while循环,该循环不断检查列表的大小是否为1,并将列表修改为仅包含单个元素(这将消除最外面的列表)。

GetAverage

当元素嵌套在任意数量的列表中时,通常的方法是Mitchel的答案。

答案 2 :(得分:0)

您还可以尝试使用列表中的numpy ravel函数,输出将是一维数组。

答案 3 :(得分:0)

这是另一个基于递归的解决方案:

l1 = [[[['a','b'],['c','d'], [[1,2]]]]]
l2 = [[[[['a','b'],['c','d']]]]]

def f(inp):
    # you can skip this if statement if you are sure that there is no empty nested list 
    if not inp:
        return [[]]
    if (all(isinstance(element, list) for element in inp)):
        return [elem for x in inp for elem in f(x)]
    else:
        return [inp]

使用all(),可以检查迭代器的每个元素的条件。 结果将是:

f(l1) #[['a', 'b'], ['c', 'd'], [1, 2]]
f(l2) #[['a', 'b'], ['c', 'd'], []]

答案 4 :(得分:0)

您可以将递归与生成器一起使用:

def flatten(d):
   if all(not isinstance(i, list) for i in d):
      yield d
   else:
      for i in d:
         yield from flatten(i)

print(list(flatten([[[[['a', 'b'], ['c', 'd']]]]])))

输出:

[['a', 'b'], ['c', 'd']]