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

Python:如何用.format()格式化已排序嵌套字典并设置自适应列宽(最长项长度+3空格)

如何用Python的.format()实现带动态列宽的嵌套字典格式化输出?

问题描述

我想要用Python的.format()方法按特定格式打印嵌套字典,需求如下:

  1. 按名称字母顺序排序(已实现);
  2. 每列的宽度为该列最长字符串的长度加3个空格(尚未实现)。

涉及的字典:

data = {"Kevin H": {"street":"Maple Street 13", "phone": "01234567"}, "Stewart Bob": {"street":"Agave Street 124", "phone": "76543210"}, "John Paul": {"street":"Old Town Road 1", "phone": "09876543"}}

预期输出:

John Paul   Old Town Road 1   09876543
Kevin H     Maple Street 13   01234567
Stewart Bob Agave Street 124  76543210

现有代码(已实现排序,列宽未处理):

sorted_data = dict(sorted(data.items()))
for name, info in sorted_data.items():
    print("{} {} {}".format(name, info["street"],info["phone"]))

请问如何实现每列宽度为对应列最长字符串长度加3个空格的要求?


解决方案

要实现动态适配的列宽,核心是先计算出每列内容的最大长度,再把这个长度(加3)作为参数传给.format()的格式化规则。具体步骤如下:

  1. 计算各列的目标宽度:遍历排序后的数据,分别找出姓名、街道、电话这三列中最长字符串的长度,再加上3个空格的偏移量。
  2. 使用动态宽度的格式化语法:在.format()中用<指定左对齐(匹配你的预期输出风格),同时用自定义参数传递计算好的列宽。

完整代码如下:

data = {"Kevin H": {"street":"Maple Street 13", "phone": "01234567"}, "Stewart Bob": {"street":"Agave Street 124", "phone": "76543210"}, "John Paul": {"street":"Old Town Road 1", "phone": "09876543"}}

# 按名称字母顺序排序(你已实现的部分)
sorted_data = dict(sorted(data.items()))

# 计算每列的目标宽度:最长字符串长度 + 3
max_name_length = max(len(name) for name in sorted_data.keys())
name_column_width = max_name_length + 3

max_street_length = max(len(info["street"]) for info in sorted_data.values())
street_column_width = max_street_length + 3

max_phone_length = max(len(info["phone"]) for info in sorted_data.values())
phone_column_width = max_phone_length + 3

# 循环打印,应用动态列宽和左对齐
for name, info in sorted_data.items():
    print("{:<{name_width}} {:<{street_width}} {:<{phone_width}}".format(
        name, info["street"], info["phone"],
        name_width=name_column_width,
        street_width=street_column_width,
        phone_width=phone_column_width
    ))

运行这段代码后,输出会完全匹配你想要的格式:

John Paul   Old Town Road 1   09876543
Kevin H     Maple Street 13   01234567
Stewart Bob Agave Street 124  76543210

代码说明

  • max(len(...)):用生成器表达式快速遍历对应列的所有内容,找出最长字符串的长度;
  • {:<{width_param}}:<表示左对齐,{width_param}是我们传入的动态宽度参数,这样每列会自动适配最长内容加3个空格的宽度,后续即使数据更新,列宽也会自动调整;
  • 这种方式比硬编码列宽更灵活,能适配不同长度的输入内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:57:29