2012-05-17 40 views
8

Tôi có từ điển python dict1 với hơn 20.000 khóa và tôi muốn update từ điển đó bằng một từ điển khác dict2. Các bộ từ điển như thế này:chèn hoặc cập nhật các khóa trong từ điển python

dict1 
    key11=>[value11] 
    key12=>[value12] 
    ... 
    ... 
    keyxyz=>[value1x]  //common key 
    ...... so on 

dict2 
    key21=>[value21] 
    key22=>[value22] 
    ... 
    ... 
    keyxyz=>[value2x]  // common key 
    ........ so on 

Nếu tôi sử dụng

dict1.update(dict2) 

sau đó các phím của dict1 đó cũng tương tự như phím của dict2 sẽ có giá trị của họ bị ghi đè bởi các giá trị của dict2. Những gì tôi muốn là nếu một khóa đã có mặt trong dict1 thì giá trị của khóa đó trong dict2 phải được gắn vào giá trị của dict1. Vì vậy,

dict1.conditionalUpdate(dict2) 

nên kết quả trong

dict1 
    key11=>[value11] 
    key12=>[value12] 
    key21=>[value21] 
    key22=>[value22] 
    ... 
    ... 
    keyxyz=>[value1x,value2x] 

Một phương pháp ngây thơ sẽ được lặp lại trên phím của dict2 cho mỗi chủ chốt của dict1 và chèn hoặc phím cập nhật. Có phương pháp nào tốt hơn không? Liệu python có hỗ trợ cấu trúc dữ liệu tích hợp hỗ trợ loại chức năng này không?

+0

Đây là giải pháp cho một câu hỏi tương tự đã được đăng. http://stackoverflow.com/questions/38987/how-can-i-merge-two-python-dictionaries-as-a-single-expression – ronyswag

+0

@ronyswag Đó không phải là cùng một câu hỏi. –

Trả lời

9

Sử dụng defaultdict từ mô-đun bộ sưu tập.

>>> from collections import defaultdict 
>>> dict1 = {1:'a',2:'b',3:'c'} 
>>> dict2 = {1:'hello', 4:'four', 5:'five'} 
>>> my_dict = defaultdict(list) 
>>> for k in dict1: 
... my_dict[k].append(dict1[k]) 
... 
>>> for k in dict2: 
... my_dict[k].append(dict2[k]) 
... 
>>> my_dict[1] 
['a', 'hello'] 
+1

Chính xác. Trong thực tế, nếu bạn xem tài liệu Python có một ví dụ gần giống với những gì bạn đang yêu cầu - http://docs.python.org/library/collections.html#defaultdict-examples –

1

Đây là thực sự khá đơn giản để làm bằng cách sử dụng sự hiểu biết dict và itertools.groupby():

dict1 = {1: 1, 2: 2, 3: 3, 4: 4} 
dict2 = {5: 6, 7: 8, 1: 1, 2: 2} 

from itertools import groupby, chain 
from operator import itemgetter 

sorted_items = sorted(chain(dict1.items(), dict2.items())) 

print({key: [value[1] for value in values] for key, values in groupby(sorted_items, itemgetter(0))}) 

Cung cấp cho chúng tôi:

{1: [1, 1], 2: [2, 2], 3: [3], 4: [4], 5: [6], 7: [8]} 

Đương nhiên, điều này tạo ra một dict mới, nhưng nếu bạn cần để cập nhật dict đầu tiên, bạn có thể làm điều đó một cách tầm thường bằng cách cập nhật với cái mới. Nếu giá trị của bạn đã được liệt kê, điều này có thể cần một số sửa đổi nhỏ (nhưng tôi đoán bạn đã làm điều đó vì lợi ích của hoạt động, trong trường hợp đó, không có nhu cầu).

Tất nhiên, nếu bạn đang sử dụng Python 2.x, thì bạn sẽ muốn sử dụng dict.viewitems() hoặc dict.iteritems() trên dict.items(). Nếu bạn đang sử dụng phiên bản Python trước khi đọc dict, thì bạn có thể sử dụng dict((key , value) for ...) để thay thế.

0

Một phương pháp mà không nhập khẩu bất cứ thứ gì, chỉ với từ điển Python thường xuyên:

>>> dict1 = {1:'a',2:'b',3:'c'} 
>>> dict2 = {1:'hello', 4:'four', 5:'five'} 
>>> for k in dict2: 
... dict1[k] = dict1.get(k,"") + dict2.get(k) 
... 
>>> dict1 
{1: 'ahello', 2: 'b', 3: 'c', 4: 'four', 5: 'five'} 
>>> 

dict1.get(k,"") trả về giá trị liên quan đến k nếu nó tồn tại hoặc một chuỗi rỗng khác, và sau đó thêm nội dung của dict2 .

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