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

基于条件将元组合并为字典,寻求更Pythonic的实现方式

更Pythonic的元组分组实现方案

需求说明

将给定的元组集合按元组的第二个元素分组,同时将每个元组转换为「位置序号(从1开始)、原第二个元素、序号×10」的格式,最终生成指定结构的字典。

输入示例

x = ( (1,"A", 10),(1,"B", 10),(1,"B", 10),(1,"C", 10),(1,"C", 10),(1,"B", 10),(1,"A", 10),(1,"A", 10),(1,"C", 10),(1,"B", 10))

预期输出

{'A': [(1, 'A', 10), (7, 'A', 70), (8, 'A', 80)], 'B': [(2, 'B', 20), (3, 'B', 30), (6, 'B', 60), (10, 'B', 100)], 'C': [(4, 'C', 40), (5, 'C', 50), (9, 'C', 90)]}

已实现的基础代码

def consolidate(values):
    res = {}
    for a in values:
        if a[1] in res:
            p = res[a[1]]
            p.append(a)
            res[a[1]] = p
        else:
            res[a[1]] = [a]
    return res

更Pythonic的实现方案

方案一:使用collections.defaultdict

借助标准库的defaultdict省去手动判断键是否存在的逻辑,代码更简洁:

from collections import defaultdict

def consolidate(values):
    grouped = defaultdict(list)
    # 遍历元素并获取从1开始的位置序号
    for idx, item in enumerate(values, start=1):
        key = item[1]
        # 生成预期格式的新元组
        new_tuple = (idx, key, idx * 10)
        grouped[key].append(new_tuple)
    # 转换为普通字典返回
    return dict(grouped)

方案二:使用字典的setdefault方法

如果不想引入额外模块,用原生字典的setdefault方法也能简化逻辑:

def consolidate(values):
    grouped = {}
    for idx, item in enumerate(values, start=1):
        key = item[1]
        new_tuple = (idx, key, idx * 10)
        # 不存在键则创建空列表,直接追加元素
        grouped.setdefault(key, []).append(new_tuple)
    return grouped

说明

这两种实现都遵循了Python的简洁风格,同时完成了元组内容转换和按指定键分组的完整需求,比原代码更易读、更简洁。

内容的提问来源于stack exchange,提问作者Pankaj Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:42:42