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

bra*_*sFX 2 python python-3.x

我知道我们可以解压列表中的项目。例如这有效:

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

for a,b in mynestedlist:
    print(a)
    print(b)
Run Code Online (Sandbox Code Playgroud)

结果:

1
2
3
4
5
6
7
8
Run Code Online (Sandbox Code Playgroud)

是否可以解压看起来像这样的列表?我正在寻找一种可以控制扁平化程度的解决方案,这个问题不仅仅是任意扁平化不规则列表。

myotherlist = [[1,2,['A','B']],[3,4],[5,6],[7,8]]
Run Code Online (Sandbox Code Playgroud)

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

ValueError: too many values to unpack (expected 2)
Run Code Online (Sandbox Code Playgroud)

所以我尝试了以下方法:

for a,b,c in mynestedlist:
    print(a)
    print(b)
    print(c)
Run Code Online (Sandbox Code Playgroud)

在这种情况下我收到:

ValueError: not enough values to unpack (expected 3, got 2)
Run Code Online (Sandbox Code Playgroud)

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

期望的结果:

1
2
[A,B]
3
4
5
6
7
8
Run Code Online (Sandbox Code Playgroud)

Tom*_*zes 5

如果你有:

mylist = [[1,2,['A','B']],[3,4],[5,6],[7,8]]
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下推导式进行单级遍历(无需构造任何中间列表):

for v in (y for x in mylist for y in x):
    print(v)
Run Code Online (Sandbox Code Playgroud)

这会产生:

1
2
['A', 'B']
3
4
5
6
7
8
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

这会产生:

1
2
A
B
3
4
5
6
7
8
Run Code Online (Sandbox Code Playgroud)