2013-12-18 5 views
8

Gibt es eine Bibliothek in Python, dass ich tief merge Wörterbücher verwenden:Python Deep-Merge Wörterbuchdaten

Folgende:

a = { 'first' : { 'all_rows' : { 'pass' : 'dog', 'number' : '1' } } } 
b = { 'first' : { 'all_rows' : { 'fail' : 'cat', 'number' : '5' } } } 

Wenn ich kombiniere ich möchte diese aussehen:

a = { 'first' : { 'all_rows' : { 'pass' : 'dog', 'fail' : 'cat', 'number' : '5' } } } 
+0

Dup http://stackoverflow.com/questions/7204805/python-dictionaries-of-dictionaries-merge – GLES

Antwort

19

Ich hoffe, ich erfinde das Rad nicht neu, aber die Lösung ist ziemlich kurz. Und super zu codieren.

def merge(source, destination): 
    """ 
    run me with nosetests --with-doctest file.py 

    >>> a = { 'first' : { 'all_rows' : { 'pass' : 'dog', 'number' : '1' } } } 
    >>> b = { 'first' : { 'all_rows' : { 'fail' : 'cat', 'number' : '5' } } } 
    >>> merge(b, a) == { 'first' : { 'all_rows' : { 'pass' : 'dog', 'fail' : 'cat', 'number' : '5' } } } 
    True 
    """ 
    for key, value in source.items(): 
     if isinstance(value, dict): 
      # get node or create one 
      node = destination.setdefault(key, {}) 
      merge(value, node) 
     else: 
      destination[key] = value 

    return destination 

So ist die Idee, die Quelle zum Ziel zu kopieren, und jedes Mal ist es ein dict in der Quelle, recurse. Sie werden also einen Fehler haben, wenn in A ein bestimmtes Element ein Diktat und in B ein anderer Typ enthält.

[EDIT] wie in den Kommentaren, sagte die Lösung bereits hier war: https://stackoverflow.com/a/7205107/34871

+0

Dies ist hervorragend und ja - Spaß. Hätte das DUP schon einmal genauer unter die Lupe nehmen sollen. Nette Verwendung der Rekursion. Von kurzen Tests scheint es für den Zweck geeignet. Die Daten, mit denen ich arbeite, sind immer vom Typ dict in a oder b. – evolution

+0

+1 - Dies scheint viel einfacher, dass die DUP in dem Fall, dass wir nicht auf Konflikte kümmern – urban

Verwandte Themen