我想要将文本的部分重新排列成文本,其中这些部分以列的形式出现。
到目前为止,我想出的代码如下:
sectSepar = '\n---\n'
mltiColmn = """\
Column A
first row
second row
3rd row
---
Column B
1. only
---
Column C
1. ...
2. long-long text"""
import itertools
print( *list(itertools.zip_longest(*[
[ column.ljust(maxlen:=max(map(len, section.split('\n'))))
for column in section.split('\n') ]
for section in mltiColmn.split(sectSepar) ],
fillvalue=''.ljust(maxlen))),sep='\n')代码工作正常,但它打印:
('Column A ', 'Column B', 'Column C ')
('first row ', '1. only ', '1. ... ')
('second row', ' ', '2. long-long text')
('3rd row ', ' ', ' ')而不是
('Column A ', 'Column B', 'Column C ')
('first row ', '1. only ', '1. ... ')
('second row', ' ', '2. long-long text')
('3rd row ', ' ', ' ')我假设代码存在的问题是,Python不像我希望的那样计算maxlen的值,但是不知道如何解决这个问题。同时,我也不喜欢代码的编写方式,因为由于嵌套和难以跟踪括号,所以我失去了概述。所以我的问题是:
是否有一种方法可以为这样的文本重排编写易于阅读和理解的代码(例如,使用链接而不是嵌套命令(如max(map(len ...))) ),并提供正确的输出?
发布于 2022-09-10 23:28:22
为了解决深层次嵌套列表的问题,我建议按照以下步骤将重新排列分成几个步骤:
colmnsAsTxtLines = """\
Column A
first row
second row
3rd row
---
Column B
1. only
---
Column C
1. ...
2. long-long text"""
sectSepar = '\n---\n'
import itertools
Rows = list(itertools.zip_longest(*[ section.split('\n')
for section in colmnsAsTxtLines.split(sectSepar)],fillvalue=' '))
print( *[ list(e) for e in zip(*[list(map(str.ljust, sectnLines,
[max(map(len,sectnLines))]*len(sectnLines)))
for sectnLines in zip(*Rows) ] ) ], sep='\n')上面的代码提供了正确的请求输出:
['Column A ', 'Column B', 'Column C ']
['first row ', '1. only ', '1. ... ']
['second row', ' ', '2. long-long text']
['3rd row ', ' ', ' ']https://stackoverflow.com/questions/73672765
复制相似问题