2016-05-06 18 views
2

Ich habe folgende Python-Liste:generieren Baum aus Python Liste der Liste

[ 
    ['a.b.c.d.e.rollover', 0], 
    ['a.b.c.d.e.f.rollover', 1], 
    ['a.b.c.d.e.g.rollover', 0] 
] 

diese Liste Angenommen, extrem groß ist

Gibt es eine effiziente Möglichkeit, in Python zu konvertieren (viele Elemente!) dies in ein Multi-Level-Wörterbuch wie folgt?

{ 
    'a': { 
    'b': { 
     'c': { 
      'd': { 
       'e': { 
       'rollover': 0, 
       'f': { 
        'rollover': 1 
       } 
       'g': { 
        'rollover': 0 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

Ist das "folgende Format" eine Zeichenfolge oder eine Liste? – Oisin

+0

Nur neugierig, warum ?. Wirklich warum? – PseudoAj

+0

Das folgende Format ist eine Python-Liste. In Bezug auf den Grund: warum nicht? Dies ist für meine Anwendung erforderlich, deshalb. –

Antwort

5

Sie können defaultdict mit lambda verwenden, die defaultdict zurückgibt, die die gleiche lambda verwendet:

from collections import defaultdict 

l = [ 
    ['a.b.c.d.e.rollover', 0], 
    ['a.b.c.d.e.f.rollover', 1], 
    ['a.b.c.d.e.g.rollover', 0] 
] 

dd = lambda: defaultdict(dd) 
res = dd() 

for k, v in l: 
    d = res 
    keys = k.split('.') 

    # Add all the keys except the last one, d[x] will do since 
    # it forces default value to be generated 
    for x in keys[:-1]: 
     d = d[x] 

    # Assign value to last key 
    d[keys[-1]] = v 

print res['a']['b']['c']['d']['e']['rollover'] # 0 
print res['a']['b']['c']['d']['e']['f']['rollover'] # 1 

Kurze Erläuterung: Um automatisch eine neue defaultdict im Falle zu erzeugen, dass Schlüssel nicht existieren wir brauchen eine Funktion (oder lambda), die ein solches Objekt zurückgibt. Da defaultdict Konstruktor einen Parameter benötigt, müssen wir eine Funktion bereitstellen, die den Parameter an defaultdict übergibt. Jedes Mal, wenn der nicht vorhandene Schlüssel dereferenziert wird, wird die Funktion aufgerufen, und es wird ein neues defaultdict erstellt, das bei Bedarf die gleiche Funktion in der Zukunft wieder aufruft. Dies wird autovivification genannt.

+0

Schön. Kann ich fragen, was der Lambda-Teil tut? Ich habe noch nie eine Lambda-Konstruktion gesehen. –

+0

'Lambda' gibt einfach' defaultdict' zurück, das denselben 'Lambda' verwendet, um den Standardwert zu erzeugen. Da fehlende Schlüssel standardmäßig auf "dict" gesetzt sind, erlaubt es Zuordnungen wie 'd ['a'] ['b'] ['c'] = 'foobar''. – niemmi

+1

Ein 'Lambda' definiert nur eine Funktion prägnant als Ausdruck. Sie können 'def dd(): return defaultdict (dd)' verwenden und das gleiche Ergebnis erhalten. – Blckknght

Verwandte Themen