+2

Cách gộp 2 dictionaries trong Python

Trong thủ thuật, tôi sẽ cho bạn thấy làm thế nào để hợp nhất hai dictionaries với nhau.

Function update()

Chúng ta có 2 dict như sau

dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3}
dict2 = {'bookC': 2, 'bookD': 4, 'bookE': 5}

Làm cách nào để có thể gộp 2 dict trên thành một. Một chức năng trong Python chúng ta có thể sử dụng hoặc nói đúng hơn là một hàm được sử dụng trong Python update([other]).

Khi bạn sử dụng hàm update([other]). Những cặp giá trị key/value sẽ bị ghi đè với những keys đã tồn tại. Và trả lại giá trị None. Xem ví dụ dưới đây để hiểu rõ hơn nhé

result = dict2.update(dict1)
print(result)
None

Bởi vì hàm update() dict trong Python không trả lại một dict mới. Để xem được kết quả gộp giá trị giữa 2 dict. Bạn xem đoạn code sau

dict2.update(dict1)
print(dict2)
{'bookA': 1, 'bookB': 2, 'bookC': 3, 'bookD': 4, 'bookE': 5}

Lúc này các cặp giá trị ở dict1 sẽ được cập nhật thêm vào dict2 và những value có key ở dict2 bị trùng với dict1 sẽ bị ghi đè bằng giá trị của dict1.

Vơi hàm update() trong Python. Bạn có thể dễ dàng gộp 2 dict lại với nhau. Tuy nhiên, sử dụng cách này, bạn sẽ gặp một số vấn đề là dữ liệu gốc của dict1 và dict2 đã bị thay đổi. Và bạn không thể sự dụng lại dữ liệu gốc của nó nữa. Vậy để gộp 2 dict lại với nhau mà không làm thay đổi giá trị gốc bạn đầu chúng?

Single Expression

result = dict(dict2, **dict1)
print(result)
{'bookA': 1, 'bookB': 2, 'bookC': 3, 'bookD': 4, 'bookE': 5}

Với cách trên, các value có key trùng nhau của dict2 sẽ bị ghi đè bởi dict1. Ngược lại, nếu bạn muốn dict1 bị ghi đè bởi dict2 thì chỉ cần làm ngược lại

result = dict(dict1, **dict2)
print(result)
{'bookA': 1, 'bookB': 2, 'bookC': 2, 'bookD': 4, 'bookE': 5}

Một câu hỏi nữa đặt ra. Vậy làm cách nào để ta có thể gộp dict1 và dict2 lại với nhau mà không làm mất giá trị gốc của các từ điển đó ?

Retaining Key Values

Để trả lời cho câu hỏi trên. Hãy xem ví dụ sau để hiểu rõ ý tưởng

from itertools import chain
from collections import defaultdict
dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3}
dict2 = {'bookC': 2, 'bookD': 4, 'bookE': 5}
dict3 = defaultdict(list)
for k, v in chain(dict1.items(), dict2.items()):
    dict3[k].append(v)

for k, v in dict3.items():
    print(k, v)

Kết quả trả về

('bookA', [1])
('bookB', [2])
('bookC', [3, 2])
('bookD', [4])
('bookE', [5])

Với cách trên bạn có thể thấy với mỗi key sẽ trả về một mảng các value. dict1 và dict2 có key trùng nhau là bookC sẽ có mảng giá trị là [3, 2] chứ không hề bị ghi đè như hai ví dụ trên.

Bài viết đến đây là hết. Mong mọi người góp ý thêm để có thêm nhiều bài viết nữa 😄


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí