我有这种形式的词组:
dic = {'movie1':{('bob',1),('jim',3),('dianne',4)},
'movie2': {('dianne',1),('bob',3),('asz',4)}}
它由movie_name
作为keys
和values
的元组以及每个电影的(name,score)
组成
我想将其转换为:
{ 'bob': { 'movie1': 1,'movie2': 3},
'jim': {'movie1': 3},
'dianne': {'movie1': 4,'movie2': 1},
'asz': {'movie2: 4} }
即每个人审阅的电影,以及每部电影的得分。
我寻找一个功能,我可以通过我的字典' dic'它给出了这个结果
我试过的是:
def reviewer_rank(db):
main_l=[]
for i in dic.values():
temp_l = list(i)
temp_l=dict(temp_l).keys()
main_l.extend(temp_l)
return main_l
我能够在列表中获得dict的所有名称
答案 0 :(得分:4)
您可以使用defaultdict
来避免一些颠簸的代码检查结果dict
中是否存在每个名称:
from collections import defaultdict
d = defaultdict(dict)
for movie, scores in dic.items():
for name, score in scores:
d[name][movie] = score
d
# defaultdict: {'bob': {'movie1': 1, 'movie2': 3}, 'asz': {'movie2': 4}, 'jim': {'movie1': 3}, 'dianne': {'movie1': 4, 'movie2': 1}}
答案 1 :(得分:0)
您可以遍历外部字典的键值元组k,vs
,然后对值u, s
中的每个元组vs
进行迭代,为result[u][k]
分配{ {1}}。
由于不确定s
字典中是否已u
,我们最好使用result
:
defaultdict
您可以稍后将from collections import defaultdict
result = defaultdict(dict)
for k, vs in dic.items():
for u, s in vs:
result[u][k] = s
转换回dict,其中包含:
result
但请注意,dict(result)
是defaultdict
的子类,因此支持所有字典操作。
答案 2 :(得分:0)
这是一个天真的解决方案。这只是一个循环输入dict的简单案例,将其重组为具有所需结构的新命令:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from collections import defaultdict
dic = {'movie1': {('bob', 1), ('jim', 3), ('dianne', 4)},
'movie2': {('dianne', 1), ('bob', 3), ('asz', 4)}}
raters = defaultdict(dict)
for movie, ratings in dic.items():
for rater, rating in ratings:
raters[rater][movie] = rating
希望这有帮助!
答案 3 :(得分:0)
您可以将当前数据结构组织成元组,并基于此创建一个新的dict字典。使用生成器执行此操作,它将一次生成一个项目。
使用 namedtuple ,您可以使用字符串而不是整数来访问您的数据,这更具可读性。
from collections import defaultdict, namedtuple
entries = namedtuple('Entries', 'name movie score')
new_dic = defaultdict(dict)
keys = (entries(name[0], k, name[1]) for k, v in dic.items() for name in v)
for item in keys:
new_dic[item.name][item.movie] = item.score