如何修复Python zip()打印输出非预期缩进及适配文件写入问题
问题原因说明
你遇到的缩进异常是因为用制表符\t作为分隔符。制表符的对齐逻辑是跳转到下一个固定长度的制表位(通常是4或8个字符宽度),当第一列数值的字符长度不一致时(比如2.8占3个字符,11.6占4个字符),跳转到下一个制表位的位置就会出现偏差,最终导致列不对齐。
问题1:修复非预期缩进的实用技巧
不要用制表符做分隔,直接通过格式化字符串指定固定列宽即可,操作非常简单:
你可以给每一列指定固定的显示宽度,Python的f-string支持直接设置对齐方式和宽度,示例修改后的代码如下:
from itertools import chain data_list1 = [[7.2, 8.1, 8.9, 11.6, 7.7, 8.7, 6.9], [5.4, 8.8, 8.9, 3.7, 3.3, 5.2, 9.6], [10.8, 5.0, 5.4, 9.5, 5.3, 5.8, 2.3], [4.1, 6.6, 8.2, 6.1, 8.9, 6.6, 4.1], [2.8, 2.1, 4.1]] data_list2 = [[9.8, 11.6, 11.5, 13.3, 12.6, 10.3, 7.5], [9.3, 10.3, 10.3, 8.4, 8.8, 5.0, 5.8], [6.8, 2.3, 3.5, 7.9, 11.8, 10.7, 9.0], [5.8, 6.8, 11.7, 10.6, 11.7, 13.1, 13.6], [8.0, 3.5, 3.2]] def clean_up(list1, list2): # 扁平化列表也可以直接用chain简化写法,避免和外层变量重名 flat1 = list(chain.from_iterable(list1)) flat2 = list(chain.from_iterable(list2)) for val1, val2 in zip(flat1, flat2): # <7 表示左对齐,占7个字符宽度,足够容纳你所有最长的数值 print(f"{val1:<7}{val2}") clean_up(data_list1,data_list2)
如果需要更统一的显示效果,也可以指定数值保留固定小数位,比如统一保留1位小数:
print(f"{val1:.1f} {val2:.1f}")
另外你原代码中循环变量名和外层的扁平化列表重名了,属于不规范的写法,建议修改为val1、val2这类不会冲突的变量名,避免后续逻辑出现隐患。
问题2:该技巧是否适用于文件写入
完全适用。不管是终端打印还是写入文件,本质都是生成固定格式的字符串,你只需要把格式化后的内容写入文件即可,格式和终端显示完全一致,示例写法:
def clean_up_and_write(list1, list2, file_path="output.txt"): flat1 = list(chain.from_iterable(list1)) flat2 = list(chain.from_iterable(list2)) with open(file_path, "w", encoding="utf-8") as f: for val1, val2 in zip(flat1, flat2): # 末尾加换行符,和print逻辑一致 f.write(f"{val1:<7}{val2}\n")
内容的提问来源于stack exchange,提问作者fredericoamigo
相关产品推荐
相关产品推荐

