Как добавить несколько значений в ключ в словаре Python

Я пытаюсь создать словарь из значений в 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.

3 ответов


словарь, ассоциативный массив или карта (много имен, в основном та же функциональность) свойство является то, что ключи уникальны.

ключи, которые вы хотите иметь, которые являются целыми числами, не уникальны, если длины одинаковы, поэтому ваш код не работает. Установка нового значения для существующего ключа означает замену старого значения.

необходимо добавить пары ключ-значение в существующие словари значений.

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

должен делать трюк


Это хороший вариант использования для 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]}
}

просто альтернатива другим; вы можете сортировать по длине и использовать 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) что довольно неэффективно по сравнению с другими решениями, размещенными выше.