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

如何让Python递归排列(permutations)输出更规整有序?

优化排列输出格式的解决方案

你的递归排列代码逻辑没问题,但直接打印返回的嵌套列表确实显得杂乱。可以从输出格式化和结果排序两个角度优化,让排列展示更规整:

方案1:新增格式化打印函数(不修改原生成逻辑)

保留原排列生成逻辑,新增专门的打印函数来整理输出样式,同时对排列排序让展示更有序:

def permutations(aSet):
    # 修复原代码小bug:确保递归返回的始终是列表嵌套结构
    if len(aSet) <= 1:
        return [aSet] if aSet else []

    all_perms = []
    first_element = aSet[0:1]
    subset = aSet[1:]

    partial = permutations(subset)
    for permutation in partial:
        for index in range(len(aSet)):
            new_perm = list(permutation[:index])
            new_perm.extend(first_element)
            new_perm.extend(permutation[index:])
            all_perms.append(new_perm)

    return all_perms

def print_permutations(perms):
    sorted_perms = sorted(perms)
    print(f"共生成 {len(sorted_perms)} 种排列:")
    # 给排列编号,每个排列格式化为统一字符串
    for idx, perm in enumerate(sorted_perms, 1):
        perm_str = ", ".join(map(str, perm))
        print(f"{idx:2d}. [{perm_str}]")

# 示例调用
if __name__ == "__main__":
    input_data = [1, 2, 3]
    result = permutations(input_data)
    print_permutations(result)

运行后输出示例:

共生成 6 种排列:
 1. [1, 2, 3]
 2. [1, 3, 2]
 3. [2, 1, 3]
 4. [2, 3, 1]
 5. [3, 1, 2]
 6. [3, 2, 1]

方案2:直接返回格式化后的字符串列表

如果希望函数直接返回可打印的规整格式,可以修改原函数的返回值,将每个排列转换成统一格式的字符串:

def permutations_formatted(aSet):
    if len(aSet) <= 1:
        return [str(aSet)] if aSet else []

    all_perms = []
    first_element = aSet[0:1]
    subset = aSet[1:]

    partial = permutations_formatted(subset)
    for perm_str in partial:
        # 将字符串还原为列表进行排列操作
        perm = perm_str.strip('[]').split(', ')
        for index in range(len(aSet)):
            new_perm = perm[:index] + first_element + perm[index:]
            new_perm_str = f"[{', '.join(new_perm)}]"
            all_perms.append(new_perm_str)

    return sorted(all_perms)

# 示例调用
if __name__ == "__main__":
    input_data = ['a', 'b', 'c']
    result = permutations_formatted(input_data)
    print(f"共生成 {len(result)} 种排列:")
    for idx, perm in enumerate(result, 1):
        print(f"{idx:2d}. {perm}")

核心优化点

  • 排序:用sorted()对排列结果排序,避免输出杂乱无章
  • 统一格式:将嵌套列表转换为易读的字符串格式,添加编号方便计数
  • 修复原代码bug:原代码在输入长度为1时返回单个元素,递归会触发类型错误,改成返回嵌套列表确保逻辑一致性

内容的提问来源于stack exchange,提问作者King Ekems

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:50:21