2016-08-29 71 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)相比上面贴其他的解决方案是相当低效的。

相关问题