Вложенный словарь из dict1 и dict2 с использованием ключей из dict1 и значений из dict2 (которые являются ключами в dict1) - PullRequest
0 голосов
/ 10 ноября 2018
users = {'196': ('110', '1'), '186': ('269', '1'), '22': ('68', '4'), '196': ('650', '3')}
movies = {'110': 'Operation Dumbo Drop (1995)', '186': 'Blues Brothers, The (1980)',  '269': 'Full Monty, The (1997)', '68': 'Crow, The (1994)', '650': 'Seventh Seal, The (Sjunde inseglet, Det) (1957)'}

Мой код для создания вложенного словаря с ключами, уникальным списком пользователей (ключами от пользователей), но с использованием ключей из фильмов для замены значений идентификаторов фильмов (первый элемент списка значений от пользователей) и ведения счетов (второй элемент значения) список от пользователей) составляет:

users_preference = {k: list (set (). Union ((* map (лямбда x: [x для x в movies.values ​​()], v [0])))) для k, v в пользователях. items ()}

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

Ожидаемый результат аналогичен:

users_preference = {'196': {'Operation Dumbo Drop (1995)': '1', 'Seventh Seal, The (Sjunde inseglet, Det) (1957)': '3'}

Ответы [ 4 ]

0 голосов
/ 10 ноября 2018

Ожидаемый результат не может быть достигнут с использованием формата users, я предлагаю вам перейти на словарь, где значения являются списком кортежей:

users = {'196': [('110', '1'), ('650', '3')], '186': [('269', '1')], '22': [('68', '4')]}
movies = {'110': 'Operation Dumbo Drop (1995)', '186': 'Blues Brothers, The (1980)', '269': 'Full Monty, The (1997)',
          '68': 'Crow, The (1994)', '650': 'Seventh Seal, The (Sjunde inseglet, Det) (1957)'}

user_preference = {user: {movies.get(movie, movie): rank for movie, rank in preferences} for user, preferences in
                   users.items()}

print(user_preference)

выход

{'196': {'Operation Dumbo Drop (1995)': '1', 'Seventh Seal, The (Sjunde inseglet, Det) (1957)': '3'}, '22': {'Crow, The (1994)': '4'}, '186': {'Full Monty, The (1997)': '1'}}
0 голосов
/ 10 ноября 2018

Более многословно

Dct3 = {}
for k, v in users.items():
  v = list(v)
  v[0] = movies[v[0]]
  Dct3[k] = v

print (Dct3)
#=> {'196': ['Seventh Seal, The (Sjunde inseglet, Det) (1957)', '3'], '186': ['Full Monty, The (1997)', '1'], '22': ['Crow, The (1994)', '4']}
0 голосов
/ 10 ноября 2018

Вы можете оформить

{user:(movies[movie_id], score) for user, (movie_id, score) in users.items()}

, который производит

{'186': ('Full Monty, The (1997)', '1'),
 '196': ('Seventh Seal, The (Sjunde inseglet, Det) (1957)', '3'),
 '22': ('Crow, The (1994)', '4')}

Обратите внимание, что в вашем словаре есть дубликат ключа users ('196'). (Указано Даниэлем Месехо в комментариях.) Ключи словаря должны быть уникальными, поэтому users на самом деле выглядит так:

>>> users
>>> {'186': ('269', '1'), '196': ('650', '3'), '22': ('68', '4')}

~ ~ * редактировать 1014 *

Традиционный for цикл, который делает то же самое.

result = {}
for user, (movie_id, score) in users.items():
    result[user] = (movies[movie_id], score)
0 голосов
/ 10 ноября 2018
Dct3 = {k:(movies[v[0]],v[1]) for k, v in users.items()}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...