You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用itertools按键元组第二个元素分组Python字典?

使用itertools.groupby实现字典按键元组的第二个元素分组

你之前的代码问题出在分组键的定义错误,operator.itemgetter(list(l.keys())[0][1])是取了字典第一个键元组的第二个元素作为固定值,相当于把所有元素都按同一个固定键分组,自然得不到想要的结果。另外,itertools.groupby有个关键要求:必须先按分组键对元素排序,否则会把不连续的同组元素拆分成多个分组。

正确的groupby实现步骤

  1. 将字典的键值对转换成可迭代的items(),并按分组键(键元组的第二个元素)排序;
  2. 用groupby以每个键元组的第二个元素作为分组依据;
  3. 遍历每个分组,将组内元素整理为子字典。

代码示例:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:35:32