根据其他字典的值在Python中创建多个字典
我有一个列表,里面包含了很多字典。每个字典代表了我应用程序中发生的一个变化。这个“变化”字典有以下几个条目:
userid: The user ID for a user
ctype: A reference to a change type in my application
score: A score
其中的ctype可以是大约12种不同的字符串,比如“删除”、“新增”、“编辑”等等。下面是一个“变化”字典的例子:
{'userid':2, 'score':10, 'ctype':'edit'}
我的问题是,如何创建一个字典,能够把这个大列表中每个用户的所有变化类型汇总起来?我想把每个变化字典中的分数加起来,得到一个总分,同时统计每种变化类型的数量。我的目标是得到一个字典列表,每个字典看起来像这样:
{'userid':2, 'score':325, 'deletion':2, 'new':4, 'edit':9}
我一直在尝试解决这个问题,但我对python还很陌生,不太确定怎么去统计实际的变化类型。还有一个让我困惑的地方是,如何根据'userid'来引用一个字典。如果有人能给出答案,我相信这一切都会变得很清晰。我非常感谢任何帮助。
4 个回答
0
你能这样做吗
(这个只是个示例,不是真正的Python代码。)
{userid : {score : 1, ctype : ''}}
在Python的字典里,你可以把字典当作值放进去,也就是说,你可以在一个字典里面再放一个字典。
0
为了根据 userid
来索引字典,你可以使用一个字典里面再嵌套一个字典:
from collections import defaultdict
dict1 = {'userid': 1, 'score': 10, 'ctype': 'edit'}
dict2 = {'userid': 2, 'score': 13, 'ctype': 'other'}
dict3 = {'userid': 1, 'score': 1, 'ctype': 'edit'}
list_of_dicts = [dict1, dict2, dict3]
user_dict = defaultdict(lambda: defaultdict(int))
for d in list_of_dicts:
userid = d['userid']
user_dict[userid]['score'] += d['score']
user_dict[userid][d['ctype']] += 1
# user_dict is now
# defaultdict(<function <lambda> at 0x02A7DF30>,
# {1: defaultdict(<type 'int'>, {'edit': 2, 'score': 11}),
# 2: defaultdict(<type 'int'>, {'score': 13, 'other': 1})})
在这个例子中,我用了一个 defaultdict
,这样就不用在每次循环时都检查一下 d['ctype']
这个键是否存在了。
1
在这里,聚合数据的关键是要有一个字典,这个字典的每个键是用户的ID,而每个条目则是与这个用户ID相关的数据。
final_data = {}
for entry in data:
userid = entry["userid"]
if userid not in final_data:
final_data[userid] = {"userid": userid, "score": 0}
final_data[userid]["score"] += entry["score"]
if not entry["ctype"] in final_data[userid]:
final_data[userid][entry["ctype"]] = 1
else:
final_data[userid][entry["ctype"]] += 1
如果你想把结果作为一个字典的列表,只需要使用 final_data.values()
。