Wie in den Kommentaren erwähnt müssen Sie die Wörterbücher zunächst alle Schlüssel zu sammeln, iterieren, sonst gibt es keine Möglichkeit zu wissen, welche Schlüssel von jedem einzelnen dict fehlen. Dann können Sie merged_dict
mit einem Diktatverständnis aufbauen.
import numpy as np
dict1 = {'a': 1, 'b': 2, 'c': 3}
dict2 = {'b': 3, 'c': 4}
dict3 = {'c': 4, 'd': 4}
all_dicts = (dict1, dict2, dict3)
keys = {k for d in all_dicts for k in d}
merged_dict = {k: [d.get(k, np.nan) for d in all_dicts] for k in keys}
print(merged_dict)
Ausgang
{'a': [1, nan, nan], 'b': [2, 3, nan], 'c': [3, 4, 4], 'd': [nan, nan, 4]}
Sie konnte die Menge Verständnis innerhalb des dict Verständnis setzen, aber ich denke, dass der Code schwerer zu lesen macht.
merged_dict = {k: [d.get(k, np.nan) for d in all_dicts]
for k in {k for d in all_dicts for k in d}}
Eigentlich, das Doppel for
Schleife in dem Satz comp nicht so effizient ist. Es tut wahrscheinlich nicht viel für kleinen dicts, aber wenn die dicts groß sind, würde es effizienter sein, eine dieser Schleifen an C Geschwindigkeit zu tun mit der set.update
Methode:
keys = set()
for d in all_dicts:
keys.update(d.keys())
Dies ist wahrscheinlich noch besser:
keys = set().union(*all_dicts)
Danke, Dan. D für diesen Vorschlag!
Hier ist noch eine weitere Möglichkeit, mit itertools
:
from itertools import chain
keys = set(chain.from_iterable(dicts))
Warum kommt die 4 in der d-Taste nach den anderen Elementen in der Liste? – PeteyPii
weil es nicht in den ersten beiden Wörterbüchern existiert – Chris
Ich denke, Sie haben nur die Kugel beißen und über Wörterbücher und Schlüssel iterieren. Sie haben möglicherweise einmal iteriert, nur um alle Schlüssel zu sammeln. – hpaulj