首页 > 解决方案 > 如何从当前字典返回具有列表值的新字典?

问题描述

现在,我很难弄清楚如何获得以下输出。 

期望的输出:

 {'Bobby':  [set(), set(), set(), {'movie_2'}, set(),{'movie_1'}], 
  'Carren': [set(), set(), {'movie_4'}, {'movie_2'}, set(), {'movie_1'}],
  'Deric':  [set(), {'movie_1'}, set(), {'movie_2'}, set(),{'movie_3'}],
  'Alec':   [set(), {'movie_1'}, {'movie_3'}, set(), set(), {'movie_4'}] }

我正在使用的字典:

d = {'movie_1': {('Bobby', 5), ('Carren', 5), ('Alec', 1), ('Deric', 1)},
     'movie_2': {('Carren', 3), ('Deric', 3), ('Bobby', 3)},
     'movie_3': {('Alec', 2), ('Deric', 5)},
     'movie_4': {('Carren', 2), ('Alec', 5)} }

在每个值内部,元组代表(人,职位)。

因此,使用字典d时,当您查看键'movie_1'时,第一个值是('Bobby', 5)

然后将键'movie_1'放入列表中的第 5 个索引中。

我到目前为止的代码:

我创建了一个包含 6 项的列表set(),但我不完全确定从这里做什么才能获得所需的输出。

from collections import defaultdict

d = {
    'movie_1': {('Bobby', 5), ('Carren', 5), ('Alec', 1), ('Deric', 1)},
    'movie_2': {('Carren', 3), ('Deric', 3), ('Bobby', 3)},
    'movie_3': {('Alec', 2), ('Deric', 5)},
    'movie_4': {('Carren', 2), ('Alec', 5)},
}

def new_dict(d):
    le_dict = defaultdict(set)
    values = [set(), set(), set(), set(), set(), set()]
    for key, value in d.items():
        for person_score in value:
            le_dict[person_score[0]].add(key)   
    return le_dict

标签: python

解决方案


我建议直接从您的输入数据中计算最大索引,而不是对其进行硬编码。

from collections import defaultdict

def setlist(size):
    def gen():
        return [set() for _ in range(size)]
    return gen

def get_max_index(d):
    return max(score for ranking in d.values() for _, score in ranking)

def rearrange(d, max_index=None):
    if max_index is None:
        max_index = get_max_index(d)
    output = defaultdict(setlist(max_index + 1))
    for movie, ranking in d.items():
        for person, score in ranking:
            output[person][score].add(movie)
    return output

这是一个 IDEOne 链接:https ://ideone.com/83v6MN


推荐阅读