我有一个结构为[[s: str, s: str, s: str]]
的列表,其中可以有任意数量的项目(列表)
我想在如下列中清晰地打印此内容:
FirstFirst FirstSecond FirstThird
SecondFirst SecondSecond SecondThird
ThirdFirst ThirdSecond ThirdThird
foo bar foobar
因此,尽管有不同的长度,子列表中的每个项目都在一列中左对齐
我已经尝试过非常复杂的列表理解,比如
lists = [['FirstFirst', 'FirstSecond', 'FirstThird'],
['SecondFirst', 'SecondSecond', 'SecondThird'],
['ThirdFirst', 'ThirdSecond', 'ThirdThird'],
['foo', 'bar', 'foobar']]
[print(f'{_[0]}{" " * (15 - len(_[0]))}{_[1]}{" " * (30 - len(_[0] + _[1] + " " * (15 - len(_[0]))))}{_[2]}') for _ in lists]
虽然这确实有效,但这是非常残酷的
更糟糕的是,这个列表理解根本不可伸缩。如果我想在子列表中的每个项目中添加另一个字符串,我必须在列表理解中添加更多内容,以使所有内容仍然有效。另外,如果我想让两个列表具有不同的长度,那么所有内容都会失败
有什么更好的方法
使用理解:
这里唯一的问题是20不能是一个变量,它需要硬编码
使用列表理解来产生副作用是一种糟糕的风格:创建一个完整的列表(需要时间和内存),然后再扔掉——使用简单的循环
您需要计算每个单词(在每列中)的长度。获得单词的最大长度很简单:
得到
这看起来有点难看,如果您只获得每列的最大长度imho:
要获得列宽调整后的输出,请执行以下操作:
看
max_len = max(len(i) for j in data for i in j)
的作用zip()
转换列表列表如果需要缩短,可以使用
' | '.join()
打印列表:如果您还需要打印不均匀的列表,zip()就不行了——您可以绕过它(研究itertiols.zip_),但如果您确实需要,请在尝试完成需要的任务后,提出一个新问题,并提供相关数据
相关问题 更多 >
编程相关推荐