这里是温文默克的学习笔记—Python篇(3),要分享的例子来自《python编程快速上手 让繁琐工作自动化》的字符串章节的习题—表格打印。先来说一下题目的要求:




python 输出左对齐 制表 python print左对齐_for循环


这个例子的解决思路与我之前分享的字符图网络那个例子有些类似,而这个例子不同之处有两个,一个是本例子中列表的“长”大于“宽”,另一个是本例子需要进行对其操作。因此,我们首先需要知道每个内层列表中最长的字符串的长度。


python 输出左对齐 制表 python print左对齐_嵌套_02


笔者在这里分享两个方法,大家可以进行参考。

第一种:首先定义一个名为colWidths的列表,并colWidths = [0] * len(tableData),这样它包含的0数目与 tableData 中内层列表的数目相同。接下来使用for循环嵌套获取内层元素的长度,并将其保存一个名为length的列表中,再使用numpy模块(要是使用这种方法的话,记得在开始部分import numpy as np)的argmax方法获取最大的索引值,然后将其保存在colWidths列表中。

colWidths = [0] * len(tableData)for i in range(len(tableData)):    length = []    for j in tableData[i]:        length.append(len(j))    max_arg = np.argmax(length)    max_length = length[max_arg]    colWidths[i] = max_length

第二种:与第一种的思路前半部分大致相同,只不过不是使用numpy模块,而是使用if函数。先定义变量fuzhu的值为0,使用for循环嵌套,在最内层使用if函数来判断,如果列表中元素的长度大于变量fuzhu的值,就将它的值赋给fuzhu,然后将其保存在colWidths列表中。

colWidths = [0] * len(tableData)for i in range(len(tableData)):    fuzhu = 0    for j in range(len(tableData[i])):        if len(tableData[i][j]) > fuzhu:            fuzhu = len(tableData[i][j])    colWidths[i] = fuzhu

接下来,和字符图网络一样,使用for循环嵌套,不过需要注意的是我们要先获取内层列表的数目进行for循环,否则会出现“溢出”的情况(感兴趣的朋友可以试一下)。然后再实现“对其”操作就可以了,这又要如何来做呢?


python 输出左对齐 制表 python print左对齐_字符串_03


这里就需要用到rjust()、ljust()了。

rjust()和 ljust()字符串方法返回调用它们的字符串的填充版本,通过插入空格来对齐文本。这两个方法的第一个参数是一个整数长度,用于对齐字符串,第二个可选参数将指定一个填充字符,取代空格字符。


python 输出左对齐 制表 python print左对齐_for循环_04


此外,还有center()方法,语法是一样的,但它让文本居中,而不是左对齐或右对齐,感兴趣的朋友可以尝试一下。

因此,我们可以使用colWidths列表中的值,决定将什么整数宽度传递给rjust()或ljust()字符串方法(这里笔者要提一下,笔者实现的直接展示的那个效果,即第一列右对齐,剩下两列左对齐,题目要求是右对齐即可,大家如果要练习的话需要注意一下)。还有就是print()函数的”end”参数需要注意一下,这里就不再详述了,不懂得朋友可以看一下我的上一篇或是直接在网上检索。

for i in range(len(tableData[0])):    for j in range(len(tableData)):        if j == 0:            print(tableData[j][i].rjust(colWidths[j]) + '', end='')        else:            print(tableData[j][i].ljust(colWidths[j]) + '', end='')    print()

本次分享中笔者提到了numpy模块,这个模块在Python中也是十分重要,对数据分析也是很有帮助,之后笔者也会分享关于numpy的例子。此外,本次分享的例子依旧是《python编程快速上手 让繁琐工作自动化》的习题,想要这本书的电子版的朋友可以去我上一篇文章,链接我留在了底部,希望能对大家有所帮助~