2017-03-17 4 views
3

Ich habe eine Zeichenfolge, die unterschiedliche Längen haben kann, und ich möchte ein verschachteltes Wörterbuch erstellen. Ich habe das bis jetzt und kann anscheinend nicht herausfinden, wie ich das Problem der variablen Tiefe überwinden kann.Erstellen eines verschachtelten Python-Wörterbuchs aus der Liste

string = "a/b/c/b" 
    x = string.split('/') 
    y = {} 
    for item in x: 
     y[item] = dict() 
     ............. 

Ich habe viele verschiedene Möglichkeiten ausprobiert, aber ich weiß nicht, wie man es dynamisch erstellt. Das Endergebnis, das ich gerne bekommen würde, ist:

Ich würde gerne ein Feedback über Design und Ideen, um dies zu bekommen. diese

Danke,

Antwort

2

einfach die Schleife wie folgt aktualisieren:

y = {} 
for item in reversed(x): 
    y = {item: y} 
0

Versuchen:

string = "a/b/c/b" 
x = string.split('/') 
x.reverse() 
y = {} 
count=0 
for item in x: 
    if count==0: 
     tmp={item:{}} 
    else: 
     tmp={item: tmp} 
    count+=1 
print tmp 

Ausgang:

{'a': {'b': {'c': {'b': {}}}}} 
0

Eine einfache Möglichkeit, dies zu tun, ist Rekursion:

def fn(s): 
    if not s: 
     return {} 
    x, *y = s # Python3, for Python2 x, y = s[0], s[1:] 
    return {x:fn(y)} 

>>> fn("a/b/c/b".split('/')) 
{'a': {'b': {'c': {'b': {}}}}} 

Aber wenn Sie wollen mach es iterativ dann du a re ganz in der Nähe, verwenden Sie einfach einen Cursor, um die Struktur zu Fuß nach unten:

>>> y = {} 
>>> c = y 
>>> for item in "a/b/c/b".split('/'): 
...  c[item] = {} 
...  c = c[item] 
>>> y 
{'a': {'b': {'c': {'b': {}}}}} 
0
>>> text = 'a/b/c/d' 
>>> d = node = {} 
>>> for c in text.split('/'): 
... node = node.setdefault(c, {}) 
... 
>>> d 
{'a': {'b': {'c': {'d': {}}}}} 
+1

Während dieser Code die Frage beantworten kann, würde das Bereitstellen eines zusätzlichen Kontextes hinsichtlich dessen, wie und/oder warum er das Problem löst, den langfristigen Wert der Antwort verbessern. –

1

One Line reduzieren Version von @ozgur's answer

>>> string = "a/b/c/d" 
>>> reduce(lambda x, y: {y: x}, reversed(string.split('/')), {}) 
{'a': {'b': {'c': {'d': {}}}}} 

Aber ich bevorzuge die ursprüngliche Antwort von @ozgur

+0

Ich bevorzugte deine erste Antwort, die du gelöscht hast. Sich auf 'reversed()' zu verlassen, kann problematisch sein, wenn Sie sich mit Iteratoren/Generatoren beschäftigen müssen, aber das liegt außerhalb des Bereichs der OP-Frage. – AChampion

+0

@AChampion Das "umgekehrte" scheint jedoch so einfach zu sein. Aber das ist ein guter Punkt, obwohl selten, könnte es einen Generator oder Iterator geben, den Sie durchlaufen möchten – jamylak

Verwandte Themen