如何从当前字典中返回一个具有列表值的新字典?

2024-09-25 10:20:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

所需输出:

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

在每个值中,元组表示(person,position)。你知道吗

因此,对于字典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

Tags: keyinle列表forvaluemoviedict
3条回答

我建议直接从输入数据计算最大索引,而不是硬编码。你知道吗

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

这里有一个表意字符链接:https://ideone.com/83v6MN

list的insert方法可以如下重写,以实现泛型。没有必要找到最大大小或硬编码它。你知道吗

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


class myList(list):

    def insert(self, index, obj):
        if len(self) <= index:
            for i in range(len(self), index):
                self.append(type(obj)())
            self.append(obj)
        else:
            self[index] = obj


def new_dict(d):
    le_dict = {}

    for key, value in d.items():
        for name, index in value:
            if name not in le_dict:
                le_dict[name] = myList()
            le_dict[name].insert(index, set([key]))

    return le_dict


print(new_dict(d))
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 = {}
    for key, values in d.items():
        for person, score in values:
            if person not in le_dict:
                le_dict[person] = [set(), set(), set(), set(), set(), set()]
            le_dict[person][score].add(key)
    return le_dict

new_dict(d)

结果是:

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

相关问题 更多 >