2016-06-28 5 views
3

Sagen, ich habe zwei Objekte wie folgt aus:Wie greifen Sie auf Wörterbuchwerte zu, wenn Schlüssel in einem anderen Objekt gespeichert sind?

d={'a':{'z':1,'y':2},'b':{'z':0,'y':4}} 
k=('a','y') 

Wie kann ich diese beiden Objekte benutzen Sie:

>>> d['a']['y'] 
2 

ich es dynamisch sein müssen, damit dies nicht funktionieren:

d[k[0]][k[1]] 

weil ich bin mir nicht immer sicher über die Schachteltiefe des Wörterbuchs. k könnte ein Element oder mehrere haben.

+0

Ich denke, wir brauchen vielleicht ein wenig mehr Kontext, um diesen zu beantworten. Wie sehen die tatsächlichen Daten aus und was versuchen Sie damit? – Jeff

+1

@ JeffL. Ich stimme nicht zu, ich denke, das Problem ist ziemlich klar ausgedrückt :) –

Antwort

6
try:     
    # python 3 maybe? 
    from functools import reduce     

except ImportError: 
    # assume python 2... 
    pass     

reduce(dict.__getitem__, k, d) 

Ein wenig Erklärung angefordert wurde: reduzieren (fn, [a1, a2, a3 ...], b) übersetzt in: fn (... fn (fn (fn (b, a1), a2), a3) ...). Also paarweise einen "Akkumulator" -Wert mit aufeinanderfolgenden Werten aus der Sequenz, übergibt diese an die übergebene Funktion und verwendet diese, um den "Akkumulator" -Wert zu aktualisieren.

Also unser "Akkumulator" -Wert ist Top-Level-Wörterbuch, das wir übergeben, als das erste ("Selbst") Argument in Dictionary-Methode __getitem__, die tiefgestellten Operator implementiert.

Wie in den Kommentaren unten aufgeführt Sie operator.getitem anstelle dict.__getitem__ verallgemeinern zu anderen Datentypen, die Indizierung unterstützen wie Listen, Tupel, strings ...

+0

Was ist, wenn ich in python3 bin? –

+2

'reduce' wurde in' functools' in Python 3 begraben. –

+1

Überlegen Sie, ob Sie das zur Antwort hinzufügen, da diese Frage nicht mit beiden Tags versehen ist. Außerdem habe ich Upvoted, weil das korrekt ist, aber denke darüber nach, ein bisschen Erklärung darüber zu geben, was hier vor sich geht, da die eine Zeile für niemanden zu lehrreich ist, der sich nicht mit Pythons funktionalen Tools auskennt –

0

können glaube ich Adam-Lösung bei weitem den Reiniger ist, aber da gibt es immer eine zwingende Alternative zu den funktionalen Ansatz, könnten wir auch diese rekursiv lösen:

def get(d,k): 
    if len(k) == 1: 
      return d[k[0]] 
    return get(d[k[0]], k[1:]) 

Ähnlich ist es mit for-Schleifen:

result = d.copy() 
for key in k: 
    result = result[key] 

Beachten Sie, dass Schleifen in Python keinen eigenen Bereich haben

Verwandte Themen