如何解开深层嵌套迭代结构

问题描述:

例如说我有一个包含很多子要素其中一些结构的结构:如何解开深层嵌套迭代结构

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) 
+0

你可以使用'isinstance(I,集装箱)'和'Container'从'collections.abc'为了赶所有容器,而不仅仅是'list'和'元组'类型。 –

+0

@JimFasarakisHilliard:虽然你可能想要明确排除或特殊情况下的'str'(可能还有'bytes'和相关类型),因为它们被视为Container,但通常被用作标量。 – ShadowRanger