Python3中如何从字典列表按user_id分组提取对应id值?
按用户ID分组提取Slot ID列表
我正在使用Python3,需要处理如下包含字典的数据集,目标是按user_id分组,将每个用户对应的所有id收集到列表中。尝试了一些方法但没得到正确结果。
数据集:
slots_data = [ { "id":551, "user_id":1, "time":"199322002", "expire":"199322002" }, { "id":552, "user_id":1, "time":"199322002", "expire":"199322002" }, { "id":525, "user_id":3, "time":"199322002", "expire":"199322002" }, { "id":524, "user_id":3, "time":"199322002", "expire":"199322002" }, { "id":553, "user_id":1, "time":"199322002", "expire":"199322002" }, { "id":550, "user_id":2, "time":"199322002", "expire":"199322002" } ]
期望输出:
[ {"user_id":1,"slots_ids":[551,552,553]}, {"user_id":2,"slots_ids":[550]}, {"user_id":3,"slots_ids":[524,525]} ]
我尝试的错误代码:
final_list = [] for item in slots_data: obj = obj.dict() obj = { "user_id":item["user_id"], "slot_ids":item["id"] } final_list.append(obj) print(set(final_list))
解决方案
你的错误在于每次循环都创建新字典直接添加到列表,没有对相同user_id的条目合并,且set()无法直接处理字典(字典不可哈希)。正确逻辑是先通过临时字典分组收集ID,再转换为目标格式:
基础写法
# 创建临时字典,键为user_id,值为对应的id列表 user_slots = {} for item in slots_data: user_id = item["user_id"] slot_id = item["id"] # 初始化空列表(若user_id未在字典中) if user_id not in user_slots: user_slots[user_id] = [] # 将当前slot_id加入对应列表 user_slots[user_id].append(slot_id) # 转换为期望的列表结构 final_list = [{"user_id": uid, "slots_ids": ids} for uid, ids in user_slots.items()] print(final_list)
优化写法(使用collections.defaultdict)
用defaultdict可以自动处理列表初始化,简化代码:
from collections import defaultdict user_slots = defaultdict(list) for item in slots_data: user_slots[item["user_id"]].append(item["id"]) final_list = [{"user_id": uid, "slots_ids": ids} for uid, ids in user_slots.items()] print(final_list)
两种方法都能得到目标输出,核心是先按user_id分组收集ID,再转换为指定的字典列表结构。
内容的提问来源于stack exchange,提问作者Ahmed Yasin
相关产品推荐
相关产品推荐

