如何在Python中将字典列表转为按名称分组的字典?
解决字典列表按名称分组收集颜色的问题
给定字典列表:
items = [{'name': 'shirt', 'color': 'pink'}, {'name': 'shirt', 'color': 'white'}, {'name': 'pants', 'color': 'beige'}, {'name': 'pants', 'color': 'black'}, {'name': 'hat', 'color': 'beige'}]
需要转换为按名称作为键、对应颜色列表为值的字典:
items_sorted = {'shirt': ['pink', 'white'], 'pants': ['beige', 'black'], 'hat': ['beige'] }
你之前的代码问题在于:每次循环直接把单个颜色的字典赋值给items_sorted[name],后续赋值会覆盖掉前面的内容,且没有将颜色收集到列表中。下面提供几种可行的解决方法:
方法一:基础循环判断
先检查当前名称是否已在目标字典中,不存在则创建空列表,再将颜色追加进去:
items_sorted = {} for item in items: name = item['name'] color = item['color'] # 若名称不在字典里,初始化空列表 if name not in items_sorted: items_sorted[name] = [] # 把当前颜色追加到对应列表 items_sorted[name].append(color)
方法二:使用collections.defaultdict简化代码
defaultdict会自动为不存在的键创建指定类型的默认值(这里是空列表),省去手动判断的步骤:
from collections import defaultdict items_sorted = defaultdict(list) for item in items: items_sorted[item['name']].append(item['color']) # 可选操作:如果需要把defaultdict转换成普通字典 items_sorted = dict(items_sorted)
方法三:使用字典的setdefault方法
setdefault方法会返回键对应的值,如果键不存在,就设置默认值并返回,一行代码即可完成判断和追加:
items_sorted = {} for item in items: items_sorted.setdefault(item['name'], []).append(item['color'])
这三种方法都能实现需求,后两种代码更简洁,可根据个人习惯选择使用。
内容的提问来源于stack exchange,提问作者Victoria Le
相关产品推荐
相关产品推荐

