获取python中存在的值和总键

时间:2017-10-14 09:50:47

标签: python

我有这种形式的词组:

dic = {'movie1':{('bob',1),('jim',3),('dianne',4)},
'movie2': {('dianne',1),('bob',3),('asz',4)}}

它由movie_name作为keysvalues的元组以及每个电影的(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的所有名称

4 个答案:

答案 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