使用dict1的键和dict2的值(这是dict1中的键)从dict1和dict2嵌套的字典

时间:2018-11-10 13:08:52

标签: python dictionary nested

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)'}

我的代码用于创建嵌套字典,该字典的键具有唯一的用户列表(用户的键),但使用电影中的键替换电影ID的值(用户的值列表的第一项)并保留分数(值的第二项)用户列表)是:

  

users_preference = {k:用户中的k,v的列表(set()。union((* map(lambda x:[x代表movie中的x.values()],v [0]))))))))。 items()}

但是这将返回每个用户的所有电影,而且我不知道如何为此添加分数。能否请你帮忙?谢谢。

预期输出类似于:

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

4 个答案:

答案 0 :(得分:1)

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

保持简单,您可以使用键来访问电影词典中的值。 只需将其视为为用户中每个键的值创建一个新的元组即可。

答案 1 :(得分:1)

更详细

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

答案 2 :(得分:0)

您可以发布

{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')中有重复的密钥。 (由Daniel Mesejo在评论中指出。)字典键必须是唯一的,因此users实际上看起来像这样:

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

〜编辑〜

同样的传统for循环。

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

答案 3 :(得分:0)

使用PS> $val = [pscustomobject] @{ one = 'uno'; two = 2 } | ForEach-Object { $_.one + '!' | Add-Member -PassThru two $_.two }; $val; $val.two uno! 2 的格式无法获得预期的输出,我建议您更改为值是元组列表的字典:

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)