Python:如何查找列表中的所有加法逆对并将其移除?
移除列表加法逆对的Python实现
实现思路
- 首先统计列表中每个数值的出现次数
- 遍历所有数值,对存在加法逆的数值进行配对抵消,更新剩余计数
- 按照原列表的顺序输出剩余计数大于0的数值,保证结果顺序和原始列表中数值出现顺序一致
完整代码实现
from collections import defaultdict def remove_inverse_pairs(lst): # 统计每个数值的出现次数 count = defaultdict(int) for num in lst: count[num] += 1 visited = set() for num in list(count.keys()): if num in visited or num == 0: continue inverse = -num if inverse not in count: continue # 计算可配对的数量 pair_num = min(count[num], count[inverse]) count[num] -= pair_num count[inverse] -= pair_num # 标记已处理避免重复计算 visited.add(num) visited.add(inverse) # 可选:处理0的情况,0的加法逆是自身,每两个抵消一次 # if 0 in count: # count[0] = count[0] % 2 # 按原顺序生成结果 res = [] for num in lst: if count[num] > 0: res.append(num) count[num] -= 1 return res
测试效果
# 测试用例 lst1 = [326, -326, 336, -336, 336] lst2 = [-35, 35, 838, -838, 440] lst3 = [544, -544, 544] lst4 = [-25, 25, 32, -32, -32, 56, 79] print(remove_inverse_pairs(lst1)) # 输出 [336] print(remove_inverse_pairs(lst2)) # 输出 [440] print(remove_inverse_pairs(lst3)) # 输出 [544] print(remove_inverse_pairs(lst4)) # 输出 [-32, 56, 79]
补充说明
如果需要处理数值为0的场景,可以取消代码中0处理部分的注释,规则为每两个0抵消,剩余的0会保留在结果中。
内容的提问来源于stack exchange,提问作者sudden_clarity_clarence
相关产品推荐
相关产品推荐

