2016-08-29 98 views
7

我試圖從name_num字典中的值中創建一個字典,其中列表的長度是新鍵,並且name_num字典鍵和值是值。所以:如何將多個值添加到Python字典中的某個鍵

name_num = {"Bill": [1,2,3,4], "Bob":[3,4,2], "Mary": [5, 1], "Jim":[6,17,4], "Kim": [21,54,35]} 

我想創建以下字典:

new_dict = {4:{"Bill": [1,2,3,4]}, 3:{"Bob":[3,4,2], "Jim":[6,17,4], "Kim": [21,54,35]}, 2:{"Mary": [5, 1]}} 

我已經嘗試了許多變化,但是這個代碼讓我最接近:

for mykey in name_num: 
    new_dict[len(name_num[mykey])] = {mykey: name_num[mykey]} 

輸出:

new_dict = {4:{"Bill": [1,2,3,4]}, 3:{"Jim":[6,17,4]}, 2:{"Mary": [5, 1]}} 

我知道我需要循環thr ough代碼不知何故因此我可以添加其它值到鍵3.

回答

5

Dictionary,關聯數組或地圖(許多名稱,基本上相同的功能)屬性是密鑰是唯一的。

如果長度相同,您希望擁有的鍵(整數)不是唯一的,這就是爲什麼您的代碼無法工作。爲現有密鑰提供新的價值意味着替換舊的價值。

您必須將鍵值對添加到現有值字典中。

for mykey in name_num: 
    length = len(name_num[mykey]) 
    if length in new_dict: # key already present in new dictionary 
     new_dict[length][mykey] = name_num[mykey] 
    else: 
     new_dict[length] = {mykey: name_num[mykey]} 

應該做的伎倆

+1

謝謝Jezor。我是Python的新手。這就清除了如何將數據添加到字典中的許多混淆。 – Oedipus

22

這是一個很好的用例defaultdict

from collections import defaultdict 
name_num = { 
    'Bill': [1, 2, 3, 4], 
    'Bob': [3, 4, 2], 
    'Mary': [5, 1], 
    'Jim': [6, 17, 4], 
    'Kim': [21, 54, 35], 
} 

new_dict = defaultdict(dict) 
for name, nums in name_num.items(): 
    new_dict[len(nums)][name] = nums 

print(dict(new_dict)) 

輸出

{ 
    2: {'Mary': [5, 1]}, 
    3: {'Bob': [3, 4, 2], 'Jim': [6, 17, 4], 'Kim': [21, 54, 35]}, 
    4: {'Bill': [1, 2, 3, 4]} 
} 
+0

Karin,很好地完成。我剛接觸defaultdict。我想一旦你創建了一個默認字典,它只是一個填充數據的問題。 – Oedipus

+0

是的 - 默認字典基本上允許您設置字典鍵的默認值,如果您嘗試訪問密鑰,它不存在。它很方便:) – Karin

+0

我沒有想到'defaultdict'只是因爲它被訪問而保留了值 – Bergi

4

別人只是一種替代;可以通過長度進行排序,並使用itertools.groupby

>>> result = {} 
>>> f = lambda t: len(t[1]) 
>>> for length, groups in itertools.groupby(sorted(name_num.items(), key=f), key=f): 
...  result[length] = dict((k, v) for k, v in groups) 
>>> print result 
{ 
    2: {'Mary': [5, 1]}, 
    3: {'Bob': [3, 4, 2], 'Jim': [6, 17, 4], 'Kim': [21, 54, 35]}, 
    4: {'Bill': [1, 2, 3, 4]} 
} 

在最壞的情況下,其中每個內部列表具有不同的長度,這執行O(n^2)相比上面貼其他的解決方案是相當低效的。

相關問題