2012-07-18 27 views
6

Hãy nói rằng tôi có một danh sách các từ điển như vậy:Làm cách nào để kết hợp các từ điển có cùng khóa trong python?

dict[0] is 
{'key_a': valuex1, 
'key_b': valuex2, 
'key_c': valuex3} 

dict[1] is 
{'key_a': valuey1, 
'key_b': valuey2, 
'key_c': valuey3} 

dict[2] is 
{'key_a': valuez1, 
'key_b': valuez2, 
'key_c': valuez3} 

Tôi muốn nhân những điều này và xây dựng một từ điển lớn như vậy:

big_dict: 
{'key_a': [valuex1, valuey1, valuez1], 
'key_b': [valuex2, valuey2, valuez2], 
'key_c': [valuex3, valuey3, valuez3]} 

Có bất kỳ tao nhã "zip" -như cách để tôi làm điều này?

Tất cả các phím sẽ luôn giống nhau.

Tôi luôn có thể lặp lại các phím trên mỗi từ và xây dựng một từ điển mới của danh sách nhưng điều đó có vẻ rất khó hiểu.

Trả lời

11
big_dict = {} 
for k in dicts[0]: 
    big_dict[k] = [d[k] for d in dicts] 

(tôi đổi tên dict của bạn để dicts từ dict là một built-in, và dicts ý nghĩa hơn.)

Hoặc, với một sự hiểu biết dict:

{ k:[d[k] for d in dicts] for k in dicts[0] } 

hoặc, đối với Python < 2.7:

dict((k, [d[k] for d in dicts]) for k in dicts[0]) 
+0

Tuyệt vời. Tôi đã học được điều gì đó mới mẻ với sự hiểu biết. Cảm ơn! – hide0

3

Nếu tất cả các tín đồ đều có mẫu e bộ chìa khóa, điều này sẽ làm việc:

dict((k, [d[k] for d in dictList]) for k in dictList[0]) 

Nếu họ có thể có các phím khác nhau, bạn sẽ cần phải đầu tiên xây dựng một bộ chìa khóa bằng cách thực hiện thiết lập các công đoàn trên các phím của dicts khác nhau:

allKeys = reduce(operator.or_, (set(d.keys()) for d in dictList), set()) 

sau đó, bạn sẽ cần phải bảo vệ chống lại các phím còn thiếu trong một số dicts:

dict((k, [d[k] for d in [a, b] if k in d]) for k in allKeys) 
+3

Bạn có thể sử dụng một từ điển hiểu: '{k: [d [k] cho d trong dictList [cho k trong dictList [0]}' – Blender

+0

Có, nếu bạn đang sử dụng phiên bản Python hỗ trợ tính năng đọc từ điển. Tôi đang sử dụng 2,6 bản thân mình vì vậy tôi không có điều đó. – BrenBarn

+0

một sự hiểu biết dict là cú pháp đồng nghĩa với một biểu thức máy phát điện nơi '{key: value ...}' được thay thế bằng 'dict ((khóa, giá trị) ...)', mà thậm chí còn hợp lệ trong 2.6 –

0

bạn có thể kết hợp bộ từ điển theo cách sau:

def merge_dicts(dict_list, separator=''): 
    """ 
    Merges list of dictionaries to a single dictionary, Concatenates values with the same key. 
    :param dict_list: list of dictionaries to be merged. 
    :param separator: separator to be inserted between values of same key. 
    :return: Merged dictionary. 
    """ 
    return {k1: separator.join([d[k1] for d in dict_list if k1 in d]) 
      for k1 in set(reduce(lambda x, y: x+y, [k.keys() for k in dict_list])) 
    } 
Các vấn đề liên quan