如何解开深层嵌套迭代结构
问题描述:
例如说我有一个包含很多子要素其中一些结构的结构:如何解开深层嵌套迭代结构
v = [1, 2, 3, [4, (5, 6)]]
我怎样才能解开这些成一系列的名字只包含结构的内容而不是结构?
尝试a, b, c, d, e, f = v
会产生一个ValueError
,同时使用带星号的表达式会为名称分配一个结构。我怎样才能解开他们为了得到:
print(a, b, c, d, e, f)
打印:
1 2 3 4 5 6
答
分配是递归定义,你需要use parentheses ()
and/or square brackets []
to enclose target names和符合您可迭代的嵌套结构。你的情况:
a, b, c, (d, (e, f)) = v
print(a, b, c, d, e, f)
1 2 3 4 5 6
同样,在语义方面没有变化,你可以使用[]
表示的结构:
a, b, c, [d, [e, f]] = v
print(a, b, c, d, e, f)
1 2 3 4 5 6
或者,当然,混合起来。然后
Python将解压v
和正常分配所述第一3个值,然后解压缩的(d, (e, f))
内容和分配d
,然后再次解压(e, f)
,做同样的。
你可以看到这种情况的发生,如果您导入dis
模块和拆卸语句dis.dis
:
dis.dis('a, b, c, (d, (e, f)) = v')
1 0 LOAD_NAME 0 (v)
3 UNPACK_SEQUENCE 4 # <- first unpack
6 STORE_NAME 1 (a)
9 STORE_NAME 2 (b)
12 STORE_NAME 3 (c)
15 UNPACK_SEQUENCE 2 # <- second unpack
18 STORE_NAME 4 (d)
21 UNPACK_SEQUENCE 2 # <- third unpack
24 STORE_NAME 5 (e)
27 STORE_NAME 6 (f)
30 LOAD_CONST 0 (None)
33 RETURN_VALUE
一般来说,解压任意嵌套的结构,在分配的左侧匹配结构(目标-list):
v = [1, [2, [3, [4, 5]]]]
[a, [b, [c, [d, e]]]] = v
print(a, b, c, d, e)
1 2 3 4 5
外[]
是,当然,没有必要,只是增加他们以显示简单地相匹配的结构就足够了。
答
您可能考虑的另一个选择是平坦化结构,然后分配它。
def flatten(container):
for i in container:
if isinstance(i, (list,tuple)):
for j in flatten(i):
yield j
else:
yield i
然后
a, b, c, d, e, f = flatten(v)
你可以使用'isinstance(I,集装箱)'和'Container'从'collections.abc'为了赶所有容器,而不仅仅是'list'和'元组'类型。 –
@JimFasarakisHilliard:虽然你可能想要明确排除或特殊情况下的'str'(可能还有'bytes'和相关类型),因为它们被视为Container,但通常被用作标量。 – ShadowRanger