Python递归遍历嵌套字典后,如何优雅格式化输出动态技能列表?
均匀拆分动态技能列表的实现方案
核心思路
针对长度不固定的技能列表,可通过两种实用方式实现均匀拆分:按指定列数拆分(比如固定2列、3列展示),或按每行最大元素数拆分。拆分后配合字符串格式化对齐,就能得到整洁的输出效果。
假设你已捕获的技能列表格式
先基于你提到的「捕获值≥0的技能键值对」,假设最终得到的列表结构如下:
skills_list = [ ("火焰冲击", 95), ("寒冰护甲", 70), ("生命虹吸", 65), ("闪电链", 85), ("暗影步", 80), ("治疗祷言", 90), ("破甲一击", 75) ]
方案1:按指定列数均匀拆分
适合想固定展示列数的场景,会自动将元素均匀分配到各列——即使列表长度不能被列数整除,也会让前几列多一个元素,保证分布最均匀。
def split_by_columns(items, num_columns): # 计算每列基础元素数,以及需要多分配一个元素的列数 items_per_col, remainder = divmod(len(items), num_columns) columns = [] start_idx = 0 for i in range(num_columns): # 前remainder列多放一个元素 end_idx = start_idx + items_per_col + (1 if i < remainder else 0) columns.append(items[start_idx:end_idx]) start_idx = end_idx return columns # 示例:拆分成3列展示 skill_columns = split_by_columns(skills_list, 3)
格式化对齐输出
拆分后通过计算技能名的最大长度,实现列对齐:
# 获取最长技能名的长度,保证对齐一致性 max_name_len = max(len(name) for name, _ in skills_list) # 遍历每一行,从各列取对应位置的元素拼接 for row in zip(*skill_columns): print(" | ".join(f"{name:<{max_name_len}}: {value:>3}" for name, value in row))
输出效果:
火焰冲击 : 95 | 闪电链 : 85 | 破甲一击 : 75 寒冰护甲 : 70 | 暗影步 : 80 生命虹吸 : 65 | 治疗祷言 : 90
方案2:按每行最大元素数拆分
如果更倾向于控制每行最多显示的技能数量(比如每行3个),用这个方案更直接:
def split_by_row_limit(items, max_per_row): # 按步长切片实现每行拆分 return [items[i:i+max_per_row] for i in range(0, len(items), max_per_row)] # 示例:每行最多显示3个技能 skill_rows = split_by_row_limit(skills_list, 3)
格式化对齐输出
max_name_len = max(len(name) for name, _ in skills_list) for row in skill_rows: print(" | ".join(f"{name:<{max_name_len}}: {value:>3}" for name, value in row))
输出效果:
火焰冲击 : 95 | 寒冰护甲 : 70 | 生命虹吸 : 65 闪电链 : 85 | 暗影步 : 80 | 治疗祷言 : 90 破甲一击 : 75
适配你的Character类场景
可以把拆分和格式化逻辑封装成类方法,直接调用:
class Character: def __init__(self): self.skills = { # 你的嵌套技能字典结构 } def dict_walk(self): # 你的递归遍历逻辑,返回[(技能名, 数值), ...]格式的列表 pass def print_skills(self, display_columns=2): skills_list = self.dict_walk() if not skills_list: print("无可用技能") return columns = split_by_columns(skills_list, display_columns) max_name_len = max(len(name) for name, _ in skills_list) for row in zip(*columns): print(" | ".join(f"{name:<{max_name_len}}: {value:>3}" for name, value in row))
内容的提问来源于stack exchange,提问作者Billy Blanks
相关产品推荐
相关产品推荐

