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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:15:34