如何使用itertools按键元组第二个元素分组Python字典?
使用itertools.groupby实现字典按键元组的第二个元素分组
你之前的代码问题出在分组键的定义错误,operator.itemgetter(list(l.keys())[0][1])是取了字典第一个键元组的第二个元素作为固定值,相当于把所有元素都按同一个固定键分组,自然得不到想要的结果。另外,itertools.groupby有个关键要求:必须先按分组键对元素排序,否则会把不连续的同组元素拆分成多个分组。
正确的groupby实现步骤
- 将字典的键值对转换成可迭代的
items(),并按分组键(键元组的第二个元素)排序; - 用
groupby以每个键元组的第二个元素作为分组依据; - 遍历每个分组,将组内元素整理为子字典。
代码示例:
import itertools original_dict = {('bob', 'CA'): 90, ('tom', 'NJ'): 80, ('sarah', 'CA'): 90, ('jon', 'TX'): 90} # 先按键元组的第二个元素排序,确保同组元素连续 sorted_items = sorted(original_dict.items(), key=lambda x: x[0][1]) # 分组并构建结果字典 result = {} for state, group in itertools.groupby(sorted_items, key=lambda x: x[0][1]): result[state] = {name: score for (name, _), score in group} print(result) # 输出: {'CA': {'bob': 90, 'sarah': 90}, 'NJ': {'tom': 80}, 'TX': {'jon': 90}}
补充:更直观的遍历实现
你提到已经知道遍历的方式,这里再贴出来做对比——这种方式不需要排序,代码更简洁,对于小规模数据效率也足够:
original_dict = {('bob', 'CA'): 90, ('tom', 'NJ'): 80, ('sarah', 'CA'): 90, ('jon', 'TX'): 90} result = {} for (name, state), score in original_dict.items(): # 若state不存在则初始化空字典 result.setdefault(state, {})[name] = score print(result) # 输出和groupby方式一致
内容的提问来源于stack exchange,提问作者Manas
相关产品推荐
相关产品推荐

