请求修改Python随机三元组求和为0的代码以实现功能
问题解决:找出数组中和为0的所有三元组
需求:从数组nums = [-1,0,1,2,-1,-4]中找出所有和为0的三元组,示例输出为[-1, 0, 1]、[-1, 2, -1]。
原代码存在的问题
- 第一段代码:
- 函数内修改全局变量
l未声明global,会触发UnboundLocalError; - 递归逻辑只会不断随机选取三元组,直到找到一个符合条件的,无法收集所有结果,还可能陷入无限递归。
- 函数内修改全局变量
- 第二段代码:
仅随机选取一次三元组,不符合条件就直接结束,无法遍历所有可能的组合。
修改后的代码
方案一:高效遍历所有组合(推荐)
无需随机抽样,直接生成数组中所有可能的三元组,筛选和为0的结果并去重:
from itertools import combinations nums = [-1, 0, 1, 2, -1, -4] result = [] # 生成所有三元组组合 for triplet in combinations(nums, 3): if sum(triplet) == 0: # 排序后去重,避免重复的三元组(如[-1,2,-1]和[-1,-1,2]视为同一组) sorted_triplet = sorted(triplet) if sorted_triplet not in result: result.append(sorted_triplet) # 格式化输出 print(", ".join(str(t) for t in result))
输出结果:
[-1, 0, 1], [-1, -1, 2]
方案二:随机抽样收集所有结果(满足随机选取要求)
如果必须通过随机选取的方式逐步收集所有符合条件的三元组,可使用以下代码:
import random from itertools import combinations nums = [-1, 0, 1, 2, -1, -4] all_valid = [] # 先获取所有唯一的有效三元组(用于判断是否收集完成) target_set = set(tuple(sorted(t)) for t in combinations(nums, 3) if sum(t) == 0) while set(tuple(t) for t in all_valid) != target_set: triplet = random.sample(nums, 3) sorted_trip = sorted(triplet) if sum(triplet) == 0 and sorted_trip not in all_valid: all_valid.append(sorted_trip) print(", ".join(str(t) for t in all_valid))
内容的提问来源于stack exchange,提问作者Alekhya
相关产品推荐
相关产品推荐

