如何解压缩不同长度的嵌套列表?

时间:2019-08-18 01:24:21

标签: python python-3.x

我知道我们可以打开列表内的物品。例如,这有效:

mynestedlist = [[1,2],[3,4],[5,6],[7,8]]

for a,b in mynestedlist:
    print(a)
    print(b)

结果:

1
2
3
4
5
6
7
8

是否可以解压缩看起来像这样的列表?我正在寻找一种可以控制展平级别的解决方案,这个问题不仅仅是简单地展平不规则列表。

myotherlist = [[1,2,['A','B']],[3,4],[5,6],[7,8]]

当我尝试相同的方法时,会收到:

ValueError: too many values to unpack (expected 2)

所以我尝试了以下方法:

for a,b,c in mynestedlist:
    print(a)
    print(b)
    print(c)

在这种情况下,我收到:

ValueError: not enough values to unpack (expected 3, got 2)

如何解压缩嵌套列表,这些嵌套列表的长度可以变化也可以不变化,而不必完全展平所有包含的项目?

所需结果:

1
2
[A,B]
3
4
5
6
7
8

3 个答案:

答案 0 :(得分:4)

如果您有:

mylist = [[1,2,['A','B']],[3,4],[5,6],[7,8]]

然后,您可以使用以下方法进行理解的单级遍历(不构造任何中间列表):

for v in (y for x in mylist for y in x):
    print(v)

这将产生:

1
2
['A', 'B']
3
4
5
6
7
8

如果要展平它,可以创建一个不再构造任何中间列表的生成器。请注意,这将处理任意深度的嵌套:

def walk(e):
    if type(e) == list:
        for v2 in e:
            for v3 in walk(v2):
                yield v3
    else:
        yield e

for v in walk(mylist):
    print(v)

这将产生:

1
2
A
B
3
4
5
6
7
8

答案 1 :(得分:1)

您可以根据列表中元素的类型来进行拆包。

def unpack(element):
    if isinstance(element, list):
        return element[0]
    return element

output_list_ = []
for item_ in input_list_:
    output_list_[input_list_.index(item_)] = (
        unpack(item_))

答案 2 :(得分:1)

尝试使用总和将其平整

myotherlist = [[1,2,['A','B']],[3,4],[5,6],[7,8]]


newlist = sum(myotherlist, [])

for elem in newlist:
     print(elem)

输出:

1
2
['A', 'B']
3
4
5
6
7
8

如果您还有其他期望,请在评论中告诉我。