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

Python中如何创建键对应多值的两数之和索引字典?

解决两数之和索引对字典的覆盖问题

直接赋值dict[sum] = {i,j}会覆盖已有条目,是因为每次都把键对应的旧值替换成了新的单元素集合,正确的做法是先初始化键对应的集合(如果不存在),再往集合里添加新的索引对。另外要注意:Python中普通集合是不可哈希的,不能作为另一个集合的元素,所以你的期望结果里{{0,1}, {0,3}}这种结构是非法的,建议用frozenset或者元组来存储索引对。

方法1:使用collections.defaultdict自动初始化集合

defaultdict可以指定值的类型,当键不存在时自动创建对应的空集合,省去手动判断的步骤:

from collections import defaultdict

nums = [1, 0, -1, 0]
sum_indices = defaultdict(set)

# 遍历所有不重复的索引对(i < j 避免重复处理同一对)
for i in range(len(nums)):
    for j in range(i + 1, len(nums)):
        current_sum = nums[i] + nums[j]
        # 用frozenset存索引对,保证可哈希
        sum_indices[current_sum].add(frozenset({i, j}))

print(dict(sum_indices))

输出(用frozenset存储索引对):

{1: {frozenset({0, 1}), frozenset({0, 3})}, 0: {frozenset({0, 2}), frozenset({1, 3})}, -1: {frozenset({1, 2}), frozenset({2, 3})}}

方法2:用普通字典手动判断初始化

如果不想导入额外模块,可以直接用普通字典,手动检查键是否存在:

nums = [1, 0, -1, 0]
sum_indices = {}

for i in range(len(nums)):
    for j in range(i + 1, len(nums)):
        current_sum = nums[i] + nums[j]
        # 用排序后的元组存索引对,避免重复(比如(0,1)和(1,0)视为同一对)
        index_pair = tuple(sorted((i, j)))
        
        if current_sum not in sum_indices:
            # 键不存在时,初始化一个包含当前索引对的集合
            sum_indices[current_sum] = {index_pair}
        else:
            # 键存在时,往已有集合里添加新的索引对
            sum_indices[current_sum].add(index_pair)

print(sum_indices)

输出(用元组存储索引对,更常用易读):

{1: {(0, 1), (0, 3)}, 0: {(0, 2), (1, 3)}, -1: {(1, 2), (2, 3)}}

核心逻辑总结

  • 不要直接给键赋值新集合,而是先获取键对应的已有集合(没有就创建),再调用add()方法添加新的索引对
  • 索引对必须用可哈希类型存储(元组、frozenset),才能作为集合的元素

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:45:31