Используйте ключи, значения в одном dict, чтобы получить значения в другом dict в python - PullRequest
0 голосов
/ 26 октября 2019

У меня есть следующий словарь

names= 'bob julian tim martin rod sara joyce nick beverly kevin'.split() ids = range(len(names)) users = dict(zip(ids, names))

, поэтому результат равен

{0: 'bob', 1: 'julian', 2: 'tim', 3: 'martin', 4: 'rod', 5: 'sara', 6: 'joyce', 7: 'nick', 8: 'beverly', 9: 'kevin'}

У меня есть еще один dict по умолчанию, называемый new_dict со следующим

{5: [6, 7, 9]}

В конечном итоге я пытаюсь использовать ключи и значения из new_dict, чтобы извлечь значения из дикта пользователей, чтобы поместить его в final_dict, который выглядит следующим образом

{sara: [joyce, nick, kevin]}

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

users[new_dict.keys()]

, но когда вы сделаете это users[5], это вернет sara, как я хочу

Ответы [ 3 ]

3 голосов
/ 26 октября 2019

Во-первых, есть более простой способ определить users:

users = dict(enumerate(names))

Ваш желаемый дикт можно определить с помощью

{users[name]: [users[friend] for friend in friends] for name, friends in new_dict.items()}

Сначала вы перебираете пары ключ / значениев new_dict. И ключ, и связанные с ним значения используются в качестве ключей в user.

. Есть несколько более короткий способ написать это: использование operator.itemgetter.

from operator import itemgetter

{users[k]: list(itemgetter(*v)(users)) for k, v in new_dict.items()}

itemgetter создаетфункция, которая выполняет поиск своего аргумента, используя каждый из аргументов itemgetter в качестве ключей, возвращая результаты в виде кортежа.

0 голосов
/ 26 октября 2019

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

users = {0: 'bob', 1: 'julian', 2: 'tim', 3: 'martin', 4: 'rod', 5: 'sara', 6: 'joyce', 7: 'nick', 8: 'beverly', 9: 'kevin'}
new_dict = {5: [6, 7, 9]}
new_users = {}

for key in new_dict.keys():
    temp_users = []

    for value in new_dict[key]:
        temp_users.append(users[value])

    new_users[users[key]] = temp_users

Вывод: {'sara': ['joyce', 'nick', 'kevin']}

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

Ваш ответ был неправильным, потому что new_dict.keys() возвращает <class 'dict_keys'>, и вы не можете просто сдвинуть его и получить все значения.

0 голосов
/ 26 октября 2019

Я полагаю, вы ищете это, учитывая, что вы хотите, чтобы результат в списке ..

a = {0: 'bob', 1: 'julian', 2: 'tim', 3: 'martin', 4: 'rod', 5: 'sara', 6: 'joyce', 7: 'nick', 8: 'beverly', 9: 'kevin'}
b = {5: [6, 7, 9]}
res = [{a[k]: [a[k2] for k2 in b[k]]} for k in b]

Результат:

[{'sara': ['joyce', 'nick', 'kevin']}]
...