【问题标题】:How to add multiple values to a key in a Python dictionary如何将多个值添加到 Python 字典中的键
【发布时间】:2017-01-04 22:53:59
【问题描述】:

我正在尝试从 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]}

我想创建以下字典:

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]}}

我知道我需要以某种方式循环代码,以便将其他值添加到键 3。

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    这是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]}
    }
    

    【讨论】:

    • 卡琳,干得好。我是默认字典的新手。我想一旦你创建了一个默认字典,只需用数据填充它。
    • 是的 - 默认字典基本上允许您为字典键设置默认值,如果您尝试访问该键但它还不存在。它派上用场了很多:)
    • 我没想到 defaultdict 仅仅因为它被访问而保留了该值
    • @Bergi 这将与可变值不一致。例如,如果您有:d = defaultdict(list); value = d[non_existent_key]; value.append(1),您希望字典中有 non_existent_key: [1] 对,但如果 defaultdict 不保留访问时创建的默认值,您将始终以 [] 结尾。 defaultdict 的属性是,当您尝试以任何方式访问不存在的键时,该键将添加默认值。唯一不会触发密钥创建的是检查 key in the_dict
    • @Bergi 基本上defaultdict 的想法是在人们使用普通dict 类的setdefault 方法时开发的。你可以这样使用它:d.setdefault(key, default_value)。这就像一个 get 但如果键不存在,它会添加它并分配 default_value 的值。问题:函数调用总是创建该默认值,因此可能非常慢。 defaultdict 是一个优化的字典,其中每个 get 调用基本上是一个 setdefault 调用,但它可以避免在 key 存在时创建默认值,以获得最大的简洁性和速度。
    【解决方案2】:

    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]}
    

    应该做的伎俩

    【讨论】:

    • 谢谢杰佐。我是 Python 新手。这消除了很多关于如何向字典添加数据的困惑。
    【解决方案3】:

    只是其他人的替代品;您可以按长度排序并使用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),与上面发布的其他解决方案相比效率相当低。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-02
      • 2015-02-16
      • 1970-01-01
      • 2023-03-31
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多