如何在Python字典中为键添加多个值

Oed*_*pus 7 python dictionary

我试图从字典中的值创建一个字典,name_num其中列表的长度是新的键,name_num字典键和值是值.所以:

name_num = {"Bill": [1,2,3,4], "Bob":[3,4,2], "Mary": [5, 1], "Jim":[6,17,4], "Kim": [21,54,35]}
Run Code Online (Sandbox Code Playgroud)

我想创建以下字典:

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]}}
Run Code Online (Sandbox Code Playgroud)

我尝试了很多变化,但这段代码让我最接近:

for mykey in name_num:
    new_dict[len(name_num[mykey])] = {mykey: name_num[mykey]}
Run Code Online (Sandbox Code Playgroud)

输出:

new_dict = {4:{"Bill": [1,2,3,4]}, 3:{"Jim":[6,17,4]}, 2:{"Mary": [5, 1]}}
Run Code Online (Sandbox Code Playgroud)

我知道我需要以某种方式遍历代码,所以我可以将其他值添加到键3.

Kar*_*rin 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))
Run Code Online (Sandbox Code Playgroud)

输出:

{
    2: {'Mary': [5, 1]},
    3: {'Bob': [3, 4, 2], 'Jim': [6, 17, 4], 'Kim': [21, 54, 35]},
    4: {'Bill': [1, 2, 3, 4]}
}
Run Code Online (Sandbox Code Playgroud)

  • @Bergi基本上`defaultdict`的想法是在使用正常`dict`类的`setdefault`方法的人开发的.你可以这样使用它:`d.setdefault(key,default_value)`.这就像一个get,但是如果键不存在则添加它并指定`default_value`的值.问题:函数调用总是创建该默认值,因此可能非常慢.`defaultdict`是一个优化的字典,每个get调用基本上都是一个`setdefault`调用,但它可以避免在密钥存在时创建默认值,以获得最大的简洁性和速度. (2认同)

Jez*_*zor 5

字典,关联数组或映射(许多名称,基本上是相同的功能)属性是键是唯一的.

如果长度相同,您希望拥有的键(整数)不是唯一的,这就是您的代码不起作用的原因.为现有密钥设置新值意味着替换旧值.

您必须将键值对添加到现有值字典中.

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]}
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩