You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:36:39