Python生成单词全排列后随机抽取20个结果的代码求助
代码修改方案
核心修改点
- 补充引入强制要求的
math、random模块,保留原有sys、re依赖 - 保留原有Heap全排列生成算法,将生成结果输出到标准流,供
sys.stdin读取 - 实现标准输入读取逻辑:逐行读取全排列结果,过滤空行后存入列表,为每个排列绑定从1开始的连续序号
- 实现随机抽取逻辑:从所有排列中无重复抽取20个结果(排列总数不足20时自动抽取全部,避免运行报错)
- 用
math.factorial()计算输入单词对应的理论全排列总数,可用于校验生成结果正确性
完整修改后代码
import sys import re import math import random from io import StringIO def gen_permutations(a, n): if n == 0: print(''.join(a)) else: for i in range(n): gen_permutations(a, n-1) j = 0 if n % 2 == 0 else i a[j], a[n] = a[n], a[j] gen_permutations(a, n-1) if len(sys.argv) != 2: sys.stderr.write('one argument only\n') sys.exit(1) word = sys.argv[1] # 调用math模块计算理论全排列总数 total_perm = math.factorial(len(word)) # 捕获全排列生成的输出,导入sys.stdin供后续逻辑读取 old_stdout = sys.stdout sys.stdout = captured_output = StringIO() gen_permutations(list(word), len(word)-1) sys.stdout = old_stdout sys.stdin = StringIO(captured_output.getvalue()) # 从标准输入读取全排列,分配1起始的序号 perm_list = [] for seq, line in enumerate(sys.stdin, start=1): stripped_line = line.strip() if stripped_line: perm_list.append((seq, stripped_line)) # 随机抽取20个结果,总数不足20则取全部 pick_count = min(20, len(perm_list)) selected_perms = random.sample(perm_list, pick_count) # 格式化输出结果 print(f"=== 从{len(perm_list)}个全排列中随机抽取{pick_count}个结果 ===") for seq, perm in selected_perms: print(f"{seq}. {perm}") # 原注释段计数逻辑(可按需启用) # counts = {} # for line in sys.stdin: # for word in re.findall(r'[a-z\']+', line.lower()): # counts[word] = counts.get(word, 0) + 1 # for word, count in sorted(counts.items()): # print (word, count)
运行说明
- 执行命令格式:
python 脚本文件名.py 目标单词,例如python perm.py mice - 输入4位长度单词时总排列数为24,将输出20个带对应序号的随机排列结果
- 输入单词长度小于4时(如3位单词总排列数为6),自动输出全部排列结果,不会触发抽样参数错误
内容的提问来源于stack exchange,提问作者M8 Dim
相关产品推荐
相关产品推荐

