Python打印带坐标轴标签的网格时双位数索引对齐实现方法
问题原因
错位的核心原因是输出固定宽度不匹配:
- 原代码打印网格单元格时,每个单元格固定占2个打印宽度(1个字符内容+1个末尾空格)
- 打印底部列号时直接用
print(Column, end=' '),个位列号占2宽度(1位数字+1空格)刚好匹配,但两位及以上列号占3+宽度,超出单元格宽度,逐列累积后就会出现错位;同时右侧行号的预留宽度是写死的3位,当行号超过两位数时也会撑坏格式。
无依赖解决方案
不需要引入任何外部模块,只需先动态计算索引所需的最大宽度,统一所有单元格、列号、行号的输出占位宽度,就能实现任意行列数下的完美对齐。
修正后的printG方法代码如下:
def printG(self): # 计算行列索引的最大字符长度,动态确定单元格占位宽度 max_idx = max(self.rows - 1, self.cols - 1) idx_len = len(str(max_idx)) cell_width = idx_len + 1 # 每个单元格/列号固定占宽度,留1个空格做分隔 # 逐行打印网格内容 + 右侧行号 for row in range(self.rows): for col in range(self.cols): # 每个网格内容左对齐,占满固定宽度 print(f"{self.Grid[row][col]:<{cell_width}}", end='') # 右侧行号右对齐,宽度适配最大索引长度 print(f"|{row:>{idx_len}}") # 打印底部列号,每个列号和网格单元格同宽度左对齐 for col in range(self.cols): print(f"{col:<{cell_width}}", end='') print()
实现效果
以15行15列网格为例,修正后的输出完全对齐,不会出现偏移:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | 0 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | 1 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | 2 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | 3 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | 4 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | 5 _ _ _ _ _ _ _ _ _ _ _ _ _ _ ■ | 6 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | 7 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | 8 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | 9 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |10 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |11 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |12 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |13 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |14 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
如果后续网格行列数扩展到100行/列以上,代码会自动把单元格宽度调整为4(3位索引+1个分隔空格),始终保持对齐。
内容的提问来源于stack exchange,提问作者Ahab N
相关产品推荐
相关产品推荐

