2017-06-01 32 views
2

我正在處理一個包含許多字典的列表。在這裏,我試圖根據他們的關鍵價值將這些字典合併成一個字典。爲了說明,請參閱下面的示例。如何根據給定的鍵列在列表中組合多個詞典?

my_dict =[{'COLUMN_NAME': 'TABLE_1_COL_1', 'TABLE_NAME': 'TABLE_1'}, 
{'COLUMN_NAME': 'TABLE_1_COL_2', 'TABLE_NAME': 'TABLE_1'}, 
{'COLUMN_NAME': 'TABLE_1_COL_3', 'TABLE_NAME': 'TABLE_1'}, 
{'COLUMN_NAME': 'TABLE_2_COL_1', 'TABLE_NAME': 'TABLE_2'}, 
{'COLUMN_NAME': 'TABLE_2_COL_2', 'TABLE_NAME': 'TABLE_2'}] 

這裏,對於任何鍵值與另一個鍵值匹配,則需要組合其他鍵值。 下面是我期望從上面的字典列表中的示例輸出。

new_lst = [{'TABLE_NAME': 'TABLE_1','COLUMN_NAME':['TABLE_1_COL_1','TABLE_1_COL_2','TABLE_1_COL_3']}, {'TABLE_NAME': 'TABLE_2','COLUMN_NAME': ['TABLE_2_COL_1','TABLE_2_COL_2']] 

我怎樣才能以最有效的方式實現這一目標。

回答

1

這樣的事情?

data = {} 
for element in my_dict: 
    table_name = element['TABLE_NAME'] 
    column_name = element['COLUMN_NAME'] 
    if table_name not in data: 
    data[table_name] = [] 

    data[table_name].append(column_name) 

new_lst = [{'TABLE_NAME': key, 'COLUMN_NAME': val} for key, val in data.items()] 
+1

代碼緊湊,固定我的問題。 – Pradeep

2

您可以使用defaultdict獲得類似輸出。

from collections import defaultdict 

new_lst = [] 

for some_dict in list_of_dicts: 
    new_lst.append(defaultdict(list)) 

    for key, value in some_dict.items(): 
     new_lst[len(new_lst) - 1][key].append(value) 

new_lst會的形式爲:

[{'TABLE_NAME': ['TABLE_1'],'COLUMN_NAME':['TABLE_1_COL_1','TABLE_1_COL_2','TABLE_1_COL_3']}, {'TABLE_NAME': ['TABLE_2'],'COLUMN_NAME': ['TABLE_2_COL_1','TABLE_2_COL_2']] 

這是你想要的東西稍有不同(甚至奇異元素在數組)。如果給出選擇,我會建議你以這種格式保留

爲了得到你想要的到底是什麼,上面的代碼後補充一點:

for some_dict in new_lst: 
    for key, value in some_dict.items(): 
     if len(value) == 1: 
      some_dict[key] = value[0] 

現在,new_lst酷似你的預期:

[{'TABLE_NAME': 'TABLE_1','COLUMN_NAME':['TABLE_1_COL_1','TABLE_1_COL_2','TABLE_1_COL_3']}, {'TABLE_NAME': 'TABLE_2','COLUMN_NAME': ['TABLE_2_COL_1','TABLE_2_COL_2']] 
相關問題