考虑到逗号,我有一组要对齐的数字:

   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  ', '   ']

09-16 01:02