Pycharm 中制表符输出无法对齐,这个怎么解决啊?

2019-12-27 10:44:36 +08:00
 520Python
直接上代码吧:
print("number\tSquare\tCube")
for i in range (1,11):
print(i,"\t",i**2,"\t",i**3)
其中表头和输出都有制表符,输出就无法对齐:
number Square Cube
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
6846 次点击
所在节点    Python
22 条回复
520Python
2019-12-27 10:49:05 +08:00
wuwukai007
2019-12-27 10:50:38 +08:00
403
520Python
2019-12-27 10:54:54 +08:00
@wuwukai007 图片链接打开 403 吗?我点开正常打开呢
BingoXuan
2019-12-27 10:55:13 +08:00
换个思路,通过使用 str.ljust 来对齐。我一直没搞懂\t 的输出规律

for i in range (1,11):
print(''.join([str(x).ljust(10) for x in [i,i**2,i**3]]))
ipwx
2019-12-27 10:58:05 +08:00
你是不是对制表符有什么误解?

制表符的作用只是相当于填充空格,至少填充空格,至多填充空格到下一个光标位置为某个数的整倍数。你这张图看上去 PyCharm 是把它填充为 4 个空格的整倍数。

print(a, b) 这句话,a 和 b 之间本来就会有一个固定的空格。所以你 "\t",i**2,"\t",这里就会是 "\t {number} \t"。比如你那一行,4 \t 16 \t 64 \t 4,你看如果 16 前面的空格是 4 的整倍数列开始的字符,那么 16 加上后面的空格已经占据了第二个 4 的整倍数区域。\t 会让它直接输出 4 个空格占据第三个 4 的整倍数区域。。。所以和上面无法对齐。

用制表符对齐命令行输出基本没戏。你得用更高级的包,比如 terminaltables。
wy9899
2019-12-27 10:59:30 +08:00
请使用占位符
ipwx
2019-12-27 11:03:37 +08:00
@BingoXuan lstrip 还不如格式化输出

print('Number Square Cube')
for i in range(1, 11):
....print(f'{str(i):<8s}{str(i**2):<8s}{str(i**3)}')

ipwx
2019-12-27 11:04:39 +08:00
上面写错了,ljust 不如格式化输出
520Python
2019-12-27 11:06:17 +08:00
520Python
2019-12-27 11:06:39 +08:00
我直接在命令行执行代码,正常展示: https://upload-images.jianshu.io/upload_images/12134160-2233a1b0126cb7d0.jpg
lolizeppelin
2019-12-27 11:09:06 +08:00
去参考 prettytable 怎么写的
520Python
2019-12-27 11:20:25 +08:00
ipwx
2019-12-27 11:22:29 +08:00
@520Python 这哪里正常了,你没发现数字和表头没对齐么。。。

请重新阅读一下我的话。\t 的作用是对齐到某个数的整倍数。不同应用程序,这个数不一样,PyCharm 是 4,而 cmd.exe 是 8。带入 8 这个数你重新计算一下。
520Python
2019-12-27 11:24:30 +08:00
@ipwx 只是稍微比 Pycharm 里好看点^_^
BingoXuan
2019-12-27 11:31:03 +08:00
@ipwx
其实思路都是一样,都是通过填充空白字符使得最终输出字符串长度固定实现对齐。只是看到 lz 范例输出是左对齐就想到 ljust 的 api。代码可读性来看,格式化输出更好。

@520Python
terminal 在输出制表符时候的行为好像是有点不一样的。所以填充空白字符使得最终输出字符串长度固定是最稳妥的办法。
lolizeppelin
2019-12-27 11:41:49 +08:00
制表符靠谱 python 就不会用 4 空格了
制表符不靠谱又不是 python 的锅

无论什么语言写对齐都要算字符宽度然后填充空格
中文字符宽度还要麻烦一点
daimiaopeng
2019-12-27 12:20:59 +08:00
print("%4s" %num)
jin7
2019-12-27 13:45:43 +08:00
@ipwx #7
for i in range(1, 11):
....print(f'{str(i):<8}{str(i**2):<8}{str(i**3)}')
s 貌似可以去掉
jin7
2019-12-27 13:53:28 +08:00
中间对齐

for i in range(1, 11):
print(f'{str(i):^8}{str(i**2):^8}{str(i**3):^8}')

https://docs.python.org/3.8/library/string.html
no1xsyzy
2019-12-27 14:51:53 +08:00
@lolizeppelin 制表符在用于 indentation 的时候还是挺靠谱的,不管 4 还是 8 都很整齐
并且还可以根据屏幕大小同代码不同 indentation 距离(看过博客提出这个问题来决定还是采用 Tab indent )
Python 的问题好像是代码格式化时除了 indentation 还时不时需要 alignment,所以还是空格好 —— 当然,这是拍脑袋瞎猜,我没去查 PEP 说为什么这么来。

中文字符已经是比较简单的了,我提醒一下,字符修饰符才是最恶心的,因为你甚至不知道当前字体是否支持字符修饰符,它到底会渲染到另一个字符上去还是渲染成豆腐块。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/632800

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX