2013-12-18 16 views
8

Có một thư viện bằng Python mà tôi có thể sử dụng tới các từ điển merge sâu:Python sâu hợp nhất dữ liệu từ điển

Sau đây:

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

Khi tôi kết hợp tôi muốn điều này để trông giống như:

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

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

Trả lời

19

Tôi hy vọng tôi không sáng tạo lại bánh xe nhưng giải pháp là khá ngắn. Và, superfun để mã.

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 

Vì vậy, ý tưởng là sao chép nguồn vào đích và mỗi lần nó là một dict trong nguồn, hãy recurse. Vì vậy, thực sự bạn sẽ có một lỗi nếu trong A một phần tử nhất định có chứa một dict và trong B bất kỳ loại nào khác.

[EDIT] như đã nói trong ý kiến ​​giải pháp là đã ở đây: https://stackoverflow.com/a/7205107/34871

+0

này là tuyệt vời và có - vui vẻ. Nên xem xét kỹ hơn về DUP trước đó. Sử dụng dễ dàng đệ quy. Từ thử nghiệm ngắn gọn, nó có vẻ phù hợp với mục đích. Dữ liệu tôi đang làm việc với luôn luôn là loại dict trong a hoặc b. – evolution

+0

+1 - Điều này có vẻ nhanh hơn rất nhiều so với DUP trong trường hợp chúng tôi không quan tâm đến xung đột – urban

Các vấn đề liên quan