寻求Python中更简洁优雅(Pythonic)的城市信息格式化打印方案
我完全理解你用一堆制表符凑对齐时那种乱糟糟的感受——不仅编写时繁琐,后续调整数据结构或者字段长度时更是头疼。这里有几个更优雅的替代方案,帮你轻松实现工整的城市信息输出:
方案1:用内置格式化字符串(f-string)精准控制对齐
这是最省心的内置方案,不需要额外依赖。核心思路是先计算每个字段的最大宽度,然后统一用固定宽度对齐,避免手动凑制表符的混乱。
举个实际例子,假设你的嵌套字典结构如下:
cities = { "北京": { "人口": "2154万", "面积": "16410km²", "GDP": "3.7万亿" }, "上海": { "人口": "2487万", "面积": "6340km²", "GDP": "3.87万亿" } }
你可以先计算所有城市名和子字段的最大宽度,然后用f-string的对齐语法(:<宽度左对齐,:^宽度居中,:>宽度右对齐)来输出:
# 获取用户输入 input_city = input("请输入城市名称: ").strip() if input_city in cities: city_data = cities[input_city] # 计算字段名的最大宽度,保证对齐 max_field_width = max(len(field) for field in city_data.keys()) # 城市名预留足够宽度 city_name_width = len(input_city) + 4 print(f"\n{input_city:-<{city_name_width}}") for field, value in city_data.items(): # 字段名左对齐,占max_field_width宽度,然后用冒号分隔,值左对齐 print(f" {field:<{max_field_width}}: {value}") else: print("未找到该城市信息")
这种方式的好处是自适应字段长度,哪怕后续新增字段或修改字段名,代码也能自动调整对齐,不用手动改制表符。
方案2:用第三方库PrettyTable生成专业表格
如果想要更像“正规表格”的输出,PrettyTable绝对是首选——它能自动帮你处理边框、对齐、表头,代码极简。
首先安装库:
pip install prettytable
然后用它来输出城市信息:
from prettytable import PrettyTable input_city = input("请输入城市名称: ").strip() if input_city in cities: city_data = cities[input_city] table = PrettyTable() # 设置表头和内容行 table.field_names = ["字段", "信息"] for field, value in city_data.items(): table.add_row([field, value]) # 可以设置对齐方式,比如所有内容左对齐 table.align = "l" print(f"\n{input_city} 城市信息") print(table) else: print("未找到该城市信息")
输出的表格会自带边框,字段和内容完美对齐,看起来非常规整,完全不用操心对齐细节。
方案3:用textwrap处理长文本缩进对齐
如果你的城市信息里有长段落(比如城市简介),textwrap模块可以帮你自动换行并保持缩进,避免内容溢出或对齐混乱:
import textwrap cities_with_desc = { "成都": { "人口": "2119万", "面积": "14335km²", "简介": "成都是四川省省会,副省级市,是西部重要的经济、金融、文化、交通枢纽,拥有悠久的历史和丰富的美食文化,被誉为“天府之国”的核心城市。" } } input_city = input("请输入城市名称: ").strip() if input_city in cities_with_desc: city_data = cities_with_desc[input_city] max_field_width = max(len(field) for field in city_data.keys()) print(f"\n{input_city}") for field, value in city_data.items(): if field == "简介": # 长文本自动换行,缩进2个空格,每行最多60字符 wrapped_text = textwrap.fill(value, width=60, initial_indent=" ", subsequent_indent=" ") print(f"{field:<{max_field_width}}:\n{wrapped_text}") else: print(f" {field:<{max_field_width}}: {value}") else: print("未找到该城市信息")
额外小技巧:用空格替代制表符
如果你还是习惯用缩进体现层级,用固定数量的空格(比如4个)代替制表符会更稳定——因为不同终端的制表符宽度可能不一样(有的是4空格,有的是8空格),而固定空格能保证在任何环境下的缩进一致。
比如子字段内容前加4个空格,比\t更可控:
print(f" {field}: {value}")
这样就不用再堆砌一堆\t来凑对齐了。
内容的提问来源于stack exchange,提问作者Foo Fighter
相关产品推荐
相关产品推荐

