求Python脚本:生成含全部3个数字的4位可重复数字组合
生成包含全部给定数字的4位组合的简洁Python实现
需求说明
编写Python脚本,从给定3个数字(如1、5、8)生成4位数字组合,要求:
- 组合可重复单个数字
- 必须包含全部3个给定数字
- 输出格式为空格分隔的数字串
初始尝试代码
用户最初用嵌套循环实现,但输出包含不符合要求的结果(仅含1个或2个数字的组合):
def GetCombFrom(arr): for i in range(4): for j in range(4): for k in range(4): for z in range(4): if((i != 3) and (j != 3) and (k != 3) and (z!=3)): print(f"{arr[i]} {arr[j]} {arr[k]} {arr[z]}")
初始代码的错误输出
1 1 1 1 1 1 1 5 1 1 1 8 1 1 5 1 1 1 5 5 1 1 5 8 1 1 8 1 1 1 8 5 1 1 8 8 1 5 1 1 1 5 1 5 1 5 1 8 1 5 5 1 1 5 5 5
用户自行实现的正确代码
用户通过多个条件判断筛选出符合要求的组合:
def GetCombFrom(arr): for i in range(4): for j in range(4): for k in range(4): for z in range(4): if((i != 3) and (j != 3) and (k != 3) and (z!=3)): if((i==j) and (j !=k) and (k!=z) and (i!=z) and (i!= k) and (j!=z)): print(f"{arr[i]} {arr[j]} {arr[k]} {arr[z]}") if((i==k) and (i !=j) and (j!=k) and (i!=z) and (k!=z) and (j!=z)): print(f"{arr[i]} {arr[j]} {arr[k]} {arr[z]}") if((i==z) and (i !=j) and (i!=k) and (j!=k) and (k!=z) and (j!=z)): print(f"{arr[i]} {arr[j]} {arr[k]} {arr[z]}") if((j==k) and (i !=j) and (i!=k) and (i!=z) and (k!=z) and (j!=z)): print(f"{arr[i]} {arr[j]} {arr[k]} {arr[z]}") if((k==z) and (i !=j) and (i!=k) and (i!=z) and (j!=k) and (j!=z)): print(f"{arr[i]} {arr[j]} {arr[k]} {arr[z]}") if((j==z) and (i !=j) and (i!=k) and (i!=z) and (j!=k) and (k!=z)): print(f"{arr[i]} {arr[j]} {arr[k]} {arr[z]}")
正确输出结果
1 1 5 8 1 1 8 5 1 5 1 8 1 5 5 8 1 5 8 1 1 5 8 5 1 5 8 8 1 8 1 5 1 8 5 1 1 8 5 5 1 8 5 8 1 8 8 5 5 1 1 8 5 1 5 8 5 1 8 1 5 1 8 5 5 1 8 8 5 5 1 8 5 5 8 1 5 8 1 1 5 8 1 5 5 8 1 8 5 8 5 1 5 8 8 1 8 1 1 5 8 1 5 1 8 1 5 5 8 1 5 8 8 1 8 5 8 5 1 1 8 5 1 5 8 5 1 8 8 5 5 1 8 5 8 1 8 8 1 5 8 8 5 1
更简洁的实现方案
可以利用Python标准库的itertools.product生成所有可能的4位组合,再通过集合判断是否包含全部给定数字,代码更简洁易读:
import itertools def generate_valid_combinations(arr): # 生成所有4位可重复的组合 all_combinations = itertools.product(arr, repeat=4) # 筛选出包含全部3个数字的组合 valid_combinations = [comb for comb in all_combinations if set(comb) == set(arr)] # 按要求格式输出 for comb in valid_combinations: print(' '.join(map(str, comb))) # 测试调用 generate_valid_combinations([1,5,8])
代码说明
itertools.product(arr, repeat=4):生成从arr中选取元素的所有4位可重复排列,等价于嵌套4层循环,但代码更简洁。set(comb) == set(arr):将组合转为集合后,判断是否和原数字集合完全一致,确保包含全部3个数字。' '.join(map(str, comb)):将组合中的数字转为字符串并以空格分隔,符合输出格式要求。
这种实现不仅代码量大幅减少,逻辑也更清晰,扩展性更强——如果后续需要调整位数或数字数量,只需修改repeat参数或输入数组即可。
内容的提问来源于stack exchange,提问作者Deepak N
相关产品推荐
相关产品推荐

