如何让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
相关产品推荐
相关产品推荐

