考虑到逗号,我有一组要对齐的数字:
10 3
200 4000,222 3 1,5
200,21 0,3 2
30000 4,5 1
mylist = [['10', '3', '', ''],
['200', '4000,222', '3', '1,5'],
['200,21', '', '0,3', '2'],
['30000', '4,5', '1', '']]
我想要的是考虑逗号来对齐这个列表:
预期结果:
mylist = [[' 10 ', ' 3 ', ' ', ' '],
[' 200 ', '4000,222', '3 ', '1,5'],
[' 200,21', ' ', '0,3', '2 '],
['30000 ', ' 4,5 ', '1 ', ' ']]
我试着把名单翻过来:
mynewlist = list(zip(*mylist))
要查找每个子列表中逗号后最长的部分:
for m in mynewlist:
max([x[::-1].find(',') for x in m]
使用rjust和ljust,但是我不知道如何在逗号后面和逗号前面使用rjust,两者都在同一个字符串中。
如何在不使用format()的情况下解决此问题?
(我想与ljust和rjust保持一致)
最佳答案
下面是另一种方法,目前可以做到这一点。不幸的是,我看不出任何简单的方法来完成这项工作,也许是因为时间:
不管怎样,我都会解释的。r
是在手动操作之前创建的结果列表。
r = [[] for i in range(4)]
然后我们循环遍历这些值,并使用
enumerate
获取一个索引:for ind1, vals in enumerate(zip(*mylist)):
在循环中,我们获取存在的小数位数的最大长度和单词的最大长度(不包含小数位数的单词):
l = max(len(v.partition(',')[2]) for v in vals) + 1
mw = max(len(v if ',' not in v else v.split(',')[0]) for v in vals)
现在我们检查元组
vals
中的值并构建结果(是的,目前还没有办法避免这种嵌套)。 for ind2, v in enumerate(vals):
如果它包含逗号,则其格式应不同。具体地说,我们根据单词的最大长度来计算,然后加上小数位数和所需的空白:
if ',' in v:
n, d = v.split(',')
v = "".join((n.rjust(mw),',', d, " " * (l - 1 - len(d))))
在相反的情况下,我们只需
rjust
然后添加空白: else:
v = "".join((v.rjust(mw) + " " * l))
最后,我们
mw
到.rjust
。 r[ind1].append(v)
一起:
r = [[] for i in range(4)]
for ind1, vals in enumerate(zip(*mylist)):
l = max(len(v.partition(',')[2]) for v in vals) + 1
mw = max(len(v if ',' not in v else v.split(',')[0]) for v in vals)
for ind2, v in enumerate(vals):
if ',' in v:
n, d = v.split(',')
v = "".join((n.rjust(mw),',', d, " " * (l - 1 - len(d))))
else:
v = "".join((v.rjust(mw) + " " * l))
r[ind1].append(v)
现在,我们可以打印出来:
>>> print(*map(list,zip(*r)), sep='\n)
[' 10 ', ' 3 ', ' ', ' ']
[' 200 ', '4000,222', '3 ', '1,5']
[' 200,21', ' ', '0,3', '2 ']
['30000 ', ' 4,5 ', '1 ', ' ']