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
相关产品推荐
相关产品推荐

