Cách gộp 2 dictionaries trong Python


  • administrators

    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 :D



  • Hay quá anh :D lần trước mới học em làm cách kiểu mãi mới nhâp được 2 dictionary mà khó nhớ vì toàn chắp vá trên mạng, h thì chắc sẽ nhớ lâu. Mong anh có nhiều bài viết như thế này hơn. :D


  • administrators

    @Không-Ai đã nói trong Cách gộp 2 dictionaries trong Python:

    Hay quá anh :D lần trước mới học em làm cách kiểu mãi mới nhâp được 2 dictionary mà khó nhớ vì toàn chắp vá trên mạng, h thì chắc sẽ nhớ lâu. Mong anh có nhiều bài viết như thế này hơn. :D

    :bow:


Hãy đăng nhập để trả lời
 

Có vẻ như bạn đã mất kết nối tới Cộng đồng Python Việt Nam, vui lòng đợi một lúc để chúng tôi thử kết nối lại.