Python Holen Sie sich den Wörterbuchwert mit einer Schlüsselliste

Angesichts der Tatsache, dass ich habe

users = \ { 'Sam': { 'age': 19, 'location': 'Flodira', 'country': 'United States' }, 'Max': { 'age': 16, 'location': 'Sydney', 'country': 'Australia' } } def getUserValue(query): return users[query] getUserValue(['Sam', 'location']) 

Wie könnte ich das machen? Ich weiß, ich könnte gerade users['Sam']['location'] , was ich gerne machen würde, ist Sam's Standort über ein Listenobjekt.

6 Solutions collect form web for “Python Holen Sie sich den Wörterbuchwert mit einer Schlüsselliste”

Hier ist eine generische Lösung, die verschiedene Ebenen der Verschachtelung behandelt:

 def getUserValue(users, query): v = users for i in query: v = v[i] return v print(getUserValue(users, ['Sam', 'location'])) # Flodira 
 def getUserValue(query): assert(len(query) == 2) return users[query[0]][query[1]] 

Ist das was du suchst?

Sie könnten dieses Problem mit Rekursion lösen:

 def getByList(d, l): if len(l) == 0: return d else: return getByList(d[l[0]], l[1:]) def getUserValue(query): return getByList(users, query) 

Für eine allgemeinere Lösung als Jared's, könntest du das Listen-Auspacken mit einer rekursiven Funktion verwenden.

 def getUserValue(dic, lis): if len(lis) > 1: return getUserValue(dic[lis[0]], lis[1:]) else: return dic[lis[0]] 

Wie wäre es mit den folgenden?

 users = \ { 'Sam': { 'age': 19, 'location': 'Flodira', 'country': 'United States' }, 'Max': { 'age': 16, 'location': 'Sydney', 'country': 'Australia' } } def getUserValue(my_args): item = users[my_args.pop(0)] while my_args: item = item[my_args.pop(0)] return item print(getUserValue(['Sam', 'location'])) # prints -> Flodira 

Behält das item als Wörterbuch, bis die übergebene Liste erschöpft ist.

Sie könnten einfaches altes reduce und operator.getitem

 import operator def getUserValue(dic, lis): return reduce(operator.getitem, lis, dic) 
Python ist die beste Programmiersprache der Welt.