Создание нового словаря из существующего словаря - PullRequest
1 голос
/ 20 июня 2020

Я хочу создать новый словарь (new_dict) из старого словаря (my_dict), в new_dict значения my_dict будут ключами, а ключи будут значениями.

Ожидаемый результат: {"name" : [1, 3, 5], "last_name": [2, 4, 6]}

Но я получаю: {"name": [1, 2, 3, 4, 5, 6 ], "last_name": [1, 2, 3, 4, 5, 6]}

Это код:

def my_function(my_dict):
    # Creating new dictionary
    new_dict = dict.fromkeys(set(my_dict.values()), [])

    for key, value in my_dict.items():
        new_dict[value].append(key)

    return new_dict

# Existing dictionary
my_dict = {
    1: "name",
    2: "last_name",
    3: "name",
    4: "last_name",
    5: "name",
    6: "last_name"}
res = my_function(my_dict)
print(res)

Ответы [ 6 ]

5 голосов
/ 20 июня 2020

Эта строка:

new_dict.fromkeys(set(my_dict.values()), [])

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

Вы можете использовать понимание dict в этом случае:

new_dict = { k: [] for k in my_dict.values() }
2 голосов
/ 20 июня 2020

Вы можете использовать collections.defaultdict(list) для создания словаря list значений:

import collections

my_dict = {
    1: "name",
    2: "last_name",
    3: "name",
    4: "last_name",
    5: "name",
    6: "last_name",
}

d = collections.defaultdict(list)
for num, text in my_dict.items():
    d[text].append(num)

Вы получаете то, что хотите.

См. Документацию здесь: https://docs.python.org/3/library/collections.html#collections .defaultdict

Цитирование примера :

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> sorted(d.items())
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
1 голос
/ 20 июня 2020

Вот что вы можете сделать:

my_dict = {1: "name",
           2: "last_name",
           3: "name",
           4: "last_name",
           5: "name",
           6: "last_name"}

def my_function(my_dict):

    new_dict = {v:[k for k in my_dict.keys() if my_dict[k] == v] for v in my_dict.values()}

    return new_dict

print(my_function(my_dict))

Вывод:

{'name': [1, 3, 5], 'last_name': [2, 4, 6]}
0 голосов
/ 20 июня 2020

Вы можете использовать collections.defaultdict или dict.setdefault. Уже есть ответ с использованием defualtdict, поэтому я показываю второй вариант:

new_dict = {}
for k, v in my_dict.items():
    vv = new_dict.setdefault(v, [])
    vv.append(k)
0 голосов
/ 20 июня 2020

Прошу прощения за мои предыдущие ответы. Вот обновленный. Он может добиться результата, хотя и нуждается в улучшении. Поделитесь своими мыслями по оптимизации:)

new_dict = {v: [x for x, y in my_dict.items() if y == v] for k, v in my_dict.items() }

{'name': [1, 3, 5], 'last_name': [2, 4, 6]}

0 голосов
/ 20 июня 2020

Если все данные находятся в этом формате, вы можете использовать свойство нечетных / четных ключей:

def func(my_dict):
    new_dict = {}
    new_dict['name'] = {}
    new_dict['last_name'] = {}
    for i in my_dict.keys():
        if i%2 == 1 :
            new_dict['name'].append(i)
        else :
            new_dict['last_name'].append(i)
    return new_dict
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...