Hướng dẫn merge nested dictionaries python - hợp nhất từ ​​điển lồng nhau python

Này, tôi cũng có cùng một vấn đề nhưng tôi mặc dù là một giải pháp và tôi sẽ đăng nó ở đây, trong trường hợp nó cũng hữu ích cho những người khác, về cơ bản là hợp nhất từ ​​điển lồng nhau và cũng thêm các giá trị, đối với tôi tôi cần tính toán một số xác suất để điều này Một người đã làm việc tuyệt vời:

#used to copy a nested dict to a nested dict
def deepupdate(target, src):
    for k, v in src.items():
        if k in target:
            for k2, v2 in src[k].items():
                if k2 in target[k]:
                    target[k][k2]+=v2
                else:
                    target[k][k2] = v2
        else:
            target[k] = copy.deepcopy(v)

Bằng cách sử dụng phương thức trên, chúng ta có thể hợp nhất:

Target = {'6,6': {'6,63': 1}, '63, 4 ': {' 4,4 ': 1},' 4,4 ': {' 4,3 ': 1} , '6,63': {'63, 4 ': 1}}

src = {'5,4': {'4,4': 1}, '5,5': {'5,4': 1}, '4,4': {'4,3': 1} }

và điều này sẽ trở thành: {'5,5': {'5,4': 1}, '5,4': {'4,4': 1}, '6,6': {'6,63' : 1}, '63, 4 ': {' 4,4 ': 1},' 4,4 ': {' 4,3 ': 2},' 6,63 ': {'63, 4': 1 }}

Cũng nhận thấy những thay đổi ở đây:

Target = {'6,6': {'6,63': 1}, '6,63': {'63, 4 ': 1},' 4,4 ': {' 4,3 ': 1} , '63, 4 ': {' 4,4 ': 1}}'4,4': {'4,3': 1}, '63,4': {'4,4': 1}}

src = {'5,4': {'4,4': 1}, '4,3': {'3,4': 1}, '4,4': {'4,9': 1} , '3,4': {'4,4': 1}, '5,5': {'5,4': 1}}}'4,4': {'4,9': 1}, '3,4': {'4,4': 1}, '5,5': {'5,4': 1}}

hợp nhất = {'5,4': {'4,4': 1}, '4,3': {'3,4': 1}, '6,63': {'63, 4 ': 1} , '5,5': {'5,4': 1}, '6,6': {'6,63': 1}, '3,4': {'4,4': 1}, ' 63,4 ': {' 4,4 ': 1},' 4,4 ': {' 4,3 ': 1,' 4,9 ': 1}}'4,4': {'4,3': 1, '4,9': 1}}

Đừng quên cũng thêm nhập cho bản sao:

import copy

Một từ điển có thể chứa một từ điển khác, từ đó có thể chứa từ điển, v.v. đến độ sâu tùy ý. Điều này được gọi là & NBSP; Từ điển lồng nhau.nested dictionary.nested dictionary.

Nội dung chính ShowShow

  • Tạo một từ điển lồng nhau
  • Người xây dựng dict ()
  • Truy cập các mục từ điển lồng nhau
  • Thay đổi các mục từ điển lồng nhau
  • Thêm hoặc cập nhật các mục từ điển lồng nhau
  • Hợp nhất hai từ điển lồng nhau
  • Xóa các mục từ điển lồng nhau
  • Xóa một mục bằng khóa
  • Xóa mục được chèn cuối cùng
  • Lặp lại thông qua một từ điển lồng nhau

Bạn có thể lặp lại tất cả các giá trị trong một từ điển lồng nhau bằng cách sử dụng lồng nhau cho vòng lặp.structured information (similar to ‘records’ or ‘structs’ in other languages).

Tạo một từ điển lồng nhau

Người xây dựng dict ()

Từ điển lồng nhau là một trong nhiều cách để thể hiện thông tin có cấu trúc (tương tự như ‘bản ghi, hoặc‘ cấu trúc trong các ngôn ngữ khác).structured information (similar to ‘records’ or ‘structs’ in other languages).

D = {'emp1': {'name': 'Bob', 'job': 'Mgr'},
     'emp2': {'name': 'Kim', 'job': 'Dev'},
     'emp3': {'name': 'Sam', 'job': 'Dev'}}

Người xây dựng dict ()

Từ điển lồng nhau là một trong nhiều cách để thể hiện thông tin có cấu trúc (tương tự như ‘bản ghi, hoặc‘ cấu trúc trong các ngôn ngữ khác).structured information (similar to ‘records’ or ‘structs’ in other languages).

Để tạo một từ điển lồng nhau, chỉ cần chuyển khóa từ điển: cặp giá trị làm đối số từ khóa cho hàm tạo

D = dict(emp1 = {'name': 'Bob', 'job': 'Mgr'},
         emp2 = {'name': 'Kim', 'job': 'Dev'},
         emp3 = {'name': 'Sam', 'job': 'Dev'})

print(D)
# Prints {'emp1': {'name': 'Bob', 'job': 'Mgr'},
#         'emp2': {'name': 'Kim', 'job': 'Dev'},
#         'emp3': {'name': 'Sam', 'job': 'Dev'}}
5.key:value pair as keyword arguments to
D = dict(emp1 = {'name': 'Bob', 'job': 'Mgr'},
         emp2 = {'name': 'Kim', 'job': 'Dev'},
         emp3 = {'name': 'Sam', 'job': 'Dev'})

print(D)
# Prints {'emp1': {'name': 'Bob', 'job': 'Mgr'},
#         'emp2': {'name': 'Kim', 'job': 'Dev'},
#         'emp3': {'name': 'Sam', 'job': 'Dev'}}
5 Constructor.
D = dict(emp1 = {'name': 'Bob', 'job': 'Mgr'},
         emp2 = {'name': 'Kim', 'job': 'Dev'},
         emp3 = {'name': 'Sam', 'job': 'Dev'})

print(D)
# Prints {'emp1': {'name': 'Bob', 'job': 'Mgr'},
#         'emp2': {'name': 'Kim', 'job': 'Dev'},
#         'emp3': {'name': 'Sam', 'job': 'Dev'}}
key:value pair as keyword arguments to
D = dict(emp1 = {'name': 'Bob', 'job': 'Mgr'},
         emp2 = {'name': 'Kim', 'job': 'Dev'},
         emp3 = {'name': 'Sam', 'job': 'Dev'})

print(D)
# Prints {'emp1': {'name': 'Bob', 'job': 'Mgr'},
#         'emp2': {'name': 'Kim', 'job': 'Dev'},
#         'emp3': {'name': 'Sam', 'job': 'Dev'}}
5 Constructor.
D = dict(emp1 = {'name': 'Bob', 'job': 'Mgr'},
         emp2 = {'name': 'Kim', 'job': 'Dev'},
         emp3 = {'name': 'Sam', 'job': 'Dev'})

print(D)
# Prints {'emp1': {'name': 'Bob', 'job': 'Mgr'},
#         'emp2': {'name': 'Kim', 'job': 'Dev'},
#         'emp3': {'name': 'Sam', 'job': 'Dev'}}

Bạn có thể sử dụng hàm Dict () cùng với chức năng & nbsp; zip () & nbsp; để kết hợp các danh sách các khóa và giá trị riêng biệt thu được động trong thời gian chạy.

IDs = ['emp1','emp2','emp3']

EmpInfo = [{'name': 'Bob', 'job': 'Mgr'},
           {'name': 'Kim', 'job': 'Dev'},
           {'name': 'Sam', 'job': 'Dev'}]

D = dict(zip(IDs, EmpInfo))

print(D)
# Prints {'emp1': {'name': 'Bob', 'job': 'Mgr'},
#         'emp2': {'name': 'Kim', 'job': 'Dev'},
#         'emp3': {'name': 'Sam', 'job': 'Dev'}}

Bạn thường muốn tạo một từ điển với các giá trị mặc định cho mỗi khóa. Phương thức FromKeys () cung cấp một cách để làm điều này.

IDs = ['emp1','emp2','emp3']
Defaults = {'name': '', 'job': ''}

D = dict.fromkeys(IDs, Defaults)

print(D)
# Prints {'emp1': {'name': '', 'job': ''},
#         'emp2': {'name': '', 'job': ''},
#         'emp3': {'name': '', 'job': ''}}

Truy cập các mục từ điển lồng nhau

Bạn có thể truy cập các mục riêng lẻ trong một từ điển lồng nhau bằng cách chỉ định khóa trong nhiều dấu ngoặc vuông.

D = {'emp1': {'name': 'Bob', 'job': 'Mgr'},
     'emp2': {'name': 'Kim', 'job': 'Dev'},
     'emp3': {'name': 'Sam', 'job': 'Dev'}}

print(D['emp1']['name'])
# Prints Bob

print(D['emp2']['job'])
# Prints Dev

Nếu bạn đề cập đến một khóa không có trong từ điển lồng nhau, một ngoại lệ sẽ được nêu ra.

print(D['emp1']['salary'])
# Triggers KeyError: 'salary'

Để tránh ngoại lệ như vậy, bạn có thể sử dụng từ điển đặc biệt & nbsp; get () & nbsp; phương thức. Phương thức này trả về giá trị cho khóa nếu khóa nằm trong từ điển, khác & nbsp; ____ ____ 16, để phương pháp này không bao giờ tăng A & nbsp; ____ ____ 17.

import copy
0

Thay đổi các mục từ điển lồng nhau

Để thay đổi giá trị của một mục cụ thể trong từ điển lồng nhau, hãy tham khảo khóa của nó.

import copy
1

Thêm hoặc cập nhật các mục từ điển lồng nhau

Thêm hoặc cập nhật các mục từ điển lồng nhau là dễ dàng. Chỉ cần tham khảo mục của nó bằng khóa của nó và gán một giá trị. Nếu khóa đã có trong từ điển, giá trị của nó được thay thế bằng cái mới.

import copy
2

Nếu khóa là mới, nó sẽ được thêm vào từ điển với giá trị của nó.

import copy
3

Hợp nhất hai từ điển lồng nhau

Sử dụng phương thức Cập nhật () tích hợp để hợp nhất các khóa và giá trị của một từ điển lồng nhau sang một từ khác. Lưu ý rằng phương pháp này một cách mù quáng ghi đè lên các giá trị của cùng một khóa nếu có một cuộc đụng độ.

D = dict(emp1 = {'name': 'Bob', 'job': 'Mgr'},
         emp2 = {'name': 'Kim', 'job': 'Dev'},
         emp3 = {'name': 'Sam', 'job': 'Dev'})

print(D)
# Prints {'emp1': {'name': 'Bob', 'job': 'Mgr'},
#         'emp2': {'name': 'Kim', 'job': 'Dev'},
#         'emp3': {'name': 'Sam', 'job': 'Dev'}}
0

Ở đây, bản ghi EMP2 ′ được cập nhật trong khi EMP3 được thêm vào từ điển.

Xóa các mục từ điển lồng nhau

Có một số cách để loại bỏ các mục khỏi một từ điển lồng nhau.

Xóa một mục bằng khóa

Nếu bạn biết khóa của mục bạn muốn, bạn có thể sử dụng & nbsp; pop () & nbsp; phương thức. Nó loại bỏ khóa và trả về giá trị của nó.

D = dict(emp1 = {'name': 'Bob', 'job': 'Mgr'},
         emp2 = {'name': 'Kim', 'job': 'Dev'},
         emp3 = {'name': 'Sam', 'job': 'Dev'})

print(D)
# Prints {'emp1': {'name': 'Bob', 'job': 'Mgr'},
#         'emp2': {'name': 'Kim', 'job': 'Dev'},
#         'emp3': {'name': 'Sam', 'job': 'Dev'}}
1

Nếu bạn không cần giá trị bị loại bỏ, hãy sử dụng câu lệnh

D = dict(emp1 = {'name': 'Bob', 'job': 'Mgr'},
         emp2 = {'name': 'Kim', 'job': 'Dev'},
         emp3 = {'name': 'Sam', 'job': 'Dev'})

print(D)
# Prints {'emp1': {'name': 'Bob', 'job': 'Mgr'},
#         'emp2': {'name': 'Kim', 'job': 'Dev'},
#         'emp3': {'name': 'Sam', 'job': 'Dev'}}
8.
D = dict(emp1 = {'name': 'Bob', 'job': 'Mgr'},
         emp2 = {'name': 'Kim', 'job': 'Dev'},
         emp3 = {'name': 'Sam', 'job': 'Dev'})

print(D)
# Prints {'emp1': {'name': 'Bob', 'job': 'Mgr'},
#         'emp2': {'name': 'Kim', 'job': 'Dev'},
#         'emp3': {'name': 'Sam', 'job': 'Dev'}}
2

Xóa mục được chèn cuối cùng

Phương thức PopItem () loại bỏ và trả về mục được chèn cuối cùng dưới dạng tuple.

D = dict(emp1 = {'name': 'Bob', 'job': 'Mgr'},
         emp2 = {'name': 'Kim', 'job': 'Dev'},
         emp3 = {'name': 'Sam', 'job': 'Dev'})

print(D)
# Prints {'emp1': {'name': 'Bob', 'job': 'Mgr'},
#         'emp2': {'name': 'Kim', 'job': 'Dev'},
#         'emp3': {'name': 'Sam', 'job': 'Dev'}}
3

Trong các phiên bản trước 3.7,

D = dict(emp1 = {'name': 'Bob', 'job': 'Mgr'},
         emp2 = {'name': 'Kim', 'job': 'Dev'},
         emp3 = {'name': 'Sam', 'job': 'Dev'})

print(D)
# Prints {'emp1': {'name': 'Bob', 'job': 'Mgr'},
#         'emp2': {'name': 'Kim', 'job': 'Dev'},
#         'emp3': {'name': 'Sam', 'job': 'Dev'}}
9 sẽ loại bỏ một mục ngẫu nhiên.

Lặp lại thông qua một từ điển lồng nhau

Bạn có thể lặp lại tất cả các giá trị trong một từ điển lồng nhau bằng cách sử dụng lồng nhau cho vòng lặp.

D = dict(emp1 = {'name': 'Bob', 'job': 'Mgr'},
         emp2 = {'name': 'Kim', 'job': 'Dev'},
         emp3 = {'name': 'Sam', 'job': 'Dev'})

print(D)
# Prints {'emp1': {'name': 'Bob', 'job': 'Mgr'},
#         'emp2': {'name': 'Kim', 'job': 'Dev'},
#         'emp3': {'name': 'Sam', 'job': 'Dev'}}
4