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

基于元组键首项合并元组项字典的实现方法

问题:合并元组键字典并转换为指定格式的元组列表

给定如下输入字典和期望输出,需要按元组键的第一个值合并(求和对应值),保留任意一个第二个值,最终转换成指定格式的元组列表:

input_dict = {("1", "a"): 1.0, ("1", "b"): 2.0, ("2", "a"): 4.0}
desired_output = [(4, "2", "a"), (3, "1", "a")]

第一步:按元组键首元素合并求和(解决你卡壳的步骤)

这里提供两种实现方式,选一种即可:

方式1:用collections.defaultdict分组

from collections import defaultdict

merged = defaultdict(lambda: {'sum': 0.0, 'second': None})
for (first, second), val in input_dict.items():
    merged[first]['sum'] += val
    # 只记录该分组下第一个遇到的第二个元素
    if merged[first]['second'] is None:
        merged[first]['second'] = second

# 转换成目标字典格式
desired_step_1_output = {(k, v['second']): v['sum'] for k, v in merged.items()}
# 输出:{('1', 'a'): 3.0, ('2', 'a'): 4.0}

方式2:普通字典实现(无需导入模块)

merged = {}
for (first, second), val in input_dict.items():
    if first not in merged:
        # 首次遇到该首元素,记录总和和第二个元素
        merged[first] = {'sum': val, 'second': second}
    else:
        # 已有该首元素,只累加值
        merged[first]['sum'] += val

desired_step_1_output = {(k, v['second']): v['sum'] for k, v in merged.items()}

后续步骤(你的原有流程)

拿到第一步的结果后,按你原来的步骤2-4执行即可:

# 步骤2:按值降序排序并转成元组列表
output_step_2 = sorted(desired_step_1_output.items(), key=lambda item: item[1], reverse=True)
# 输出:[(('2', 'a'), 4.0), (('1', 'a'), 3.0)]

# 步骤3:调换值和键的位置
output_step_3 = [(value, keys) for keys, value in output_step_2]
# 输出:[(4.0, ('2', 'a')), (3.0, ('1', 'a'))]

# 步骤4:转整数并展开元组
output_step_4 = [(int(value), *keys) for value, keys in output_step_3]
# 输出:[(4, '2', 'a'), (3, '1', 'a')]

更简洁的整合写法

可以把所有步骤合并成一段代码,省去中间变量:

from collections import defaultdict

input_dict = {("1", "a"): 1.0, ("1", "b"): 2.0, ("2", "a"): 4.0}

# 分组求和,同时记录第二个元素
grouped = defaultdict(lambda: (0.0, None))
for (first, second), val in input_dict.items():
    current_sum, current_second = grouped[first]
    grouped[first] = (current_sum + val, current_second if current_second is not None else second)

# 直接转换为目标格式并排序
result = sorted(
    [(int(total), first, second) for first, (total, second) in grouped.items()],
    key=lambda x: x[0],
    reverse=True
)

print(result)  # 输出:[(4, '2', 'a'), (3, '1', 'a')]

内容的提问来源于stack exchange,提问作者Charles Lehnen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:35:20