Python 3中如何按相同值对字典列表进行分组?
在Python 3中按字典相同值分组的方法
嘿,针对你给出的球员字典列表,想要按school、position这类字段把相同值的字典归为一组,我给你整理了几种实用的实现方法,一起来看看:
方法一:基础循环实现(新手友好)
这种方法逻辑最直观,适合刚接触Python的同学,一步步手动完成分组:
players = [ { "name": 'matt', 'school': 'WSU', 'homestate': 'CT', 'position': 'RB' }, { "name": 'jack', 'school': 'ASU', 'homestate': 'AL', 'position': 'QB' }, { "name": 'john', 'school': 'WSU', 'homestate': 'MD', 'position': 'LB' }, { "name": 'kevin', 'school': 'ALU', 'homestate': 'PA', 'position': 'LB' }, { "name": 'brady', 'school': 'UM', 'homestate': 'CA', 'position': 'QB' }, ] # 按school字段分组 grouped_by_school = {} for player in players: school_name = player['school'] # 如果当前学校还没在分组字典里,就创建一个空列表 if school_name not in grouped_by_school: grouped_by_school[school_name] = [] # 把当前球员字典加入对应学校的列表 grouped_by_school[school_name].append(player) print(grouped_by_school)
如果要按position分组,只需要把代码里的'school'换成'position'就行,逻辑完全一致。
方法二:用collections.defaultdict简化代码
Python标准库的collections.defaultdict能帮我们省去判断键是否存在的步骤,让代码更简洁:
from collections import defaultdict # 按position字段分组 grouped_by_position = defaultdict(list) for player in players: # 直接往对应位置的列表里加球员,不用手动初始化空列表 grouped_by_position[player['position']].append(player) # 如果需要把defaultdict转换成普通字典,直接用dict()包裹即可 print(dict(grouped_by_position))
defaultdict会在你访问一个不存在的键时,自动创建指定类型的默认值(这里我们指定了list,所以会自动生成空列表),非常省心。
方法三:用itertools.groupby分组(需先排序)
itertools.groupby是另一种分组方式,但要注意:它只会把连续的相同键元素归为一组,所以使用前必须先按分组字段排序:
from itertools import groupby # 第一步:先按school字段对球员列表排序 sorted_players = sorted(players, key=lambda x: x['school']) # 第二步:按school分组,用字典推导式整理结果 grouped_by_school = { key: list(group) for key, group in groupby(sorted_players, key=lambda x: x['school']) } print(grouped_by_school)
这种方法适合你需要同时完成排序和分组的场景,或者你的原始数据已经是按分组字段有序排列的情况。
内容的提问来源于stack exchange,提问作者Yuka Langbuana
相关产品推荐
相关产品推荐

