2016-10-02 51 views
0

列表創建每個鍵多個值的字典我有字典的以下列表:從字典

listofdics = [{'StrId': 11, 'ProjId': 1},{'StrId': 11,'ProjId': 2}, 
       {'StrId': 22, 'ProjId': 3},{'StrId': 22, 'ProjId': 4}, 
       {'StrId': 33, 'ProjId': 5},{'StrId': 33, 'ProjId': 6}, 
       {'StrId': 34, 'ProjId': 7}] 

我需要得到所有ProjIdStrId是重複的。所以這是我在尋找的輸出:

new_listofdics = [{11:[1,2]}, {22:[3,4]}, {33:[5,6]], {34:[7]}] 

我寫的創建與StrId值作爲密鑰字典列表的功能,並與共享相同的密鑰值的所有ProjId列表。那就是:

def compare_projids(listofdics): 
    proj_ids_dups = {} 

    for row in listofdics:  
     id_value = row['StrId'] 
     proj_id_value = row['ProjId'] 
     proj_ids_dups[id_value]=proj_id_value 

     if row['StrId'] == id_value: 
      sum_ids = [] 
      sum_ids.append(proj_id_value) 
     proj_ids_dups[id_value]=sum_ids 
    return proj_ids_dups 

這是輸出我現在得到:

new_listofdics= {33: [6], 34: [7], 11: [2], 22: [4]} 

我看到的是,append替換,而不是在結尾處添加他們每個ProjId值與最後一個迭代,列表。

我該如何解決這個問題?...

+0

它不是'append'。你每次都用'sum_ids = []' – thefourtheye

回答

2

目前還不清楚爲什麼你需要有這樣的輸出new_listofdics = [{11:[1,2]}, {22:[3,4]}, {33:[5,6]], {34:[7]}],因爲它是更好地剛剛dict對象。

所以程序應該是這樣的

>>> from collections import defaultdict 
>>> listofdics = [{'StrId': 11, 'ProjId': 1},{'StrId': 11,'ProjId': 2}, 
       {'StrId': 22, 'ProjId': 3},{'StrId': 22, 'ProjId': 4}, 
       {'StrId': 33, 'ProjId': 5},{'StrId': 33, 'ProjId': 6}, 
       {'StrId': 34, 'ProjId': 7}] 
>>> output = defaultdict(list) 
>>> for item in listofdics: 
...  output[item.get('StrId')].append(item.get('ProjId')) 
>>> dict(output) 
{11: [1, 2], 22: [3, 4], 33: [5, 6], 34: [7]} 

這是很容易去通過在所需的輸出字典。

+1

創建一個新的列表對象。你總是可以用這種方式得到所需的輸出:'[{k:v} for k,v in output.items()]''。 – skovorodkin