根据其他字典的值在Python中创建多个字典

0 投票
4 回答
1760 浏览
提问于 2025-04-16 13:00

我有一个列表,里面包含了很多字典。每个字典代表了我应用程序中发生的一个变化。这个“变化”字典有以下几个条目:

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

撰写回答