2016-08-02 5 views
4

Sagen Sie zum Beispiel ich eine Struktur aufweisen, von denen einige viele Unterelemente enthält, sind Strukturen:Wie auspacken tief verschachtelt iterable Struktur

v = [1, 2, 3, [4, (5, 6)]] 

Wie kann ich diese in eine Reihe von Namen entpacken, die nur die enthalten Inhalte der Strukturen und keine Struktur?

Probieren a, b, c, d, e, f = v löst eine ValueError während die Verwendung des markierten Ausdrucks würde eine Struktur den Namen zuweisen. Wie kann ich sie um auspacken zu bekommen:

print(a, b, c, d, e, f) 

zum ausdrucken:

1 2 3 4 5 6 

Antwort

10

Zuordnungen rekursiv definiert sind, müssen Sie use parentheses () and/or square brackets [] to enclose target names und die verschachtelte Struktur Ihrer iterable entsprechen. In Ihrem Fall:

a, b, c, (d, (e, f)) = v 
print(a, b, c, d, e, f) 
1 2 3 4 5 6 

In ähnlicher Weise ohne Änderung der Semantik, könnten Sie [] verwenden, um die Struktur zu bezeichnen:

a, b, c, [d, [e, f]] = v 
print(a, b, c, d, e, f) 
1 2 3 4 5 6 

oder, natürlich, mischen sie.

Python wird dann v auszupacken und die ersten 3 Werte normalerweise zuzuweisen, dann den Inhalt des (d, (e, f)) auszupacken und d zuweisen und dann wieder (e, f) auszupacken und das gleiche tun.

können Sie dies sehen, ob Sie die dis Modul importieren und Zerlegen der Anweisung mit 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 

Im Allgemeinen auszupacken willkürlich verschachtelten Strukturen, in der linken Seite der Zuweisung der Struktur übereinstimmen (Ziel -Liste):

v = [1, [2, [3, [4, 5]]]]  
[a, [b, [c, [d, e]]]] = v  
print(a, b, c, d, e) 
1 2 3 4 5 

die äußere [] sind, natürlich nicht notwendig, so dass sie gerade hinzufügen, einfach zu zeigen, dass die Struktur passend genügt.

3

Eine weitere Option, die Sie in Betracht ziehen könnten, ist, die Struktur zu glätten und dann zuzuordnen.

def flatten(container): 
    for i in container: 
     if isinstance(i, (list,tuple)): 
      for j in flatten(i): 
       yield j 
     else: 
      yield i 

Dann

a, b, c, d, e, f = flatten(v) 
+0

Sie nutzen könnten 'isinstance (i, Container)' mit 'Container' von' collections.abc', um alle Container zu fangen, nicht nur 'list' und' Tupel 'Arten. –

+0

@JimFasarakisHilliard: Obwohl Sie "str" ​​(und möglicherweise "bytes" und verwandte Typen) explizit explizit ausschließen oder anders angeben möchten, da sie als "Container" gelten, aber normalerweise als skalare Größen verwendet werden . – ShadowRanger