2016-10-08 5 views
0

Ich habe zwei WörterbücherWie kann ich 2 Wörterbücher vergleichen?

dict_a = {'x' : 2, 'y' : 3.5, 'z' : 4} 
dict_b = {'bob' : ['x', 'y'], 'john' : ['z', 'x'], 'bill' : ['y']} 

Ich möchte die beiden Wörterbücher vergleichen und eine neue mit den Tasten aus dict_b und Werte von dict_a, wenn die Werte von dict_b Spiel zu erstellen. Ich würde erwarten, zu sehen:

new_dict = {'bob' : [2, 3.5], 'john' : [4, 2], 'bill' : [3.5]} 

Ich habe den folgenden Code versucht:

for name, guess in dict_b.items(): 
    if guess == i in dict_a.values(): 
     new_dict[name].append(i) 
print(new_dict) 

Ich erhalte den Fehler NameError: name 'i' is not defined aber ich bin nicht sicher, wie zu definieren 'i'.

Danke für jede Hilfe Dies kann

Antwort

1

getan werden mit einem einfachen dict Verständnis:

>>> {k: [dict_a.get(x,x) for x in v] for k, v in dict_b.items()} 
{'bob': [2, 3.5], 'john': [4, 2], 'bill': [3.5]} 

Dies ersetzt Werte mit denen von dict_a, wenn sie existieren. Sonst behält man diese von dict_b (das zweite Argument in .get(x,x)).

Alternativ fixieren den ursprünglichen Code auf diese Weise:

new_dict = {} 
for name, guess in dict_b.items(): 
    new_dict[name] = [] 
    for value in guess: 
     if value in dict_a: 
      new_dict[name].append(dict_a[value]) 
print(new_dict) 
3

gut wie so:

new_dict = {name: [dict_a[k] for k in dict_b[name]] for name in` dict_b.keys()} 
2
if guess == i in dict_a.values(): 

dies nicht tun, was Sie erwarten, dass es zu tun. Python hier Ketten die Betreiber, so dass Ihr Test entspricht der folgenden:

(guess == i) and (i in dict_a.values()) 

So ist es nicht wie eine for-Schleife ausgeführt wird hier, wo Sie eine Variable i in den Wörterbuchwerte iterieren.

Darüber hinaus müssen Sie die Werte tatsächlich von diesen mehrere Schlüssel zu sammeln, so was Sie hier tun möchte, ist folgendes:

new_dict = {} 
for name, guesses in dict_b.items(): 
    result = [] 
    for guess in guesses: 
     if guess in dict_a: 
      result.append(dict_a[guess]) 
    new_dict[name] = result 

Dann Sie auch Listenkomprehensionen diese verwenden können, verkürzen:

new_dict = {} 
for name, guesses in dict_b.items(): 
    new_dict[name] = [dict_a[guess] for guess in guesses if guess in dict_a] 

Und schließlich könnte man sogar diese kombiniert mit einem dict Verständnis:

new_dict = { name: [dict_a[guess] for guess in guesses if guess in dict_a] for name, guesses in dict_b.items() } 
Verwandte Themen