Python:如何用.format()格式化已排序嵌套字典并设置自适应列宽(最长项长度+3空格)
如何用Python的
.format()实现带动态列宽的嵌套字典格式化输出? 问题描述
我想要用Python的.format()方法按特定格式打印嵌套字典,需求如下:
- 按名称字母顺序排序(已实现);
- 每列的宽度为该列最长字符串的长度加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()的格式化规则。具体步骤如下:
- 计算各列的目标宽度:遍历排序后的数据,分别找出姓名、街道、电话这三列中最长字符串的长度,再加上3个空格的偏移量。
- 使用动态宽度的格式化语法:在
.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
相关产品推荐
相关产品推荐

