python - 对齐子列表中的数字

标签 python list python-3.x numbers alignment

考虑到逗号,我想对齐一组数字:

   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,但我不知道如何在逗号之后使用 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):

如果它包含逗号,则应采用不同的格式。具体来说,我们根据单词的最大长度rjust mw 然后添加十进制数字和所需的任何空格:

        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))

最后,我们将 appendr

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

关于python - 对齐子列表中的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41324621/

相关文章:

python - 裁剪多边形并将其转换为灰度

python - 有没有办法在不实例化对象的情况下列出类的属性?

python - 将 python sqlalchemy 类转换为原始 SQL(使用外键创建表)

python - 毫秒级精确 python 计时器

python - 将元组字符串列表转换为元组列表

python - 使用 del() 删除列表中的多个元素

python - 我们可以在 Python 中添加 'OR' 运算符以及 if 和 else 吗?

python - 使用来自 render_template() 的 'for' 循环在 html 中显示表格

python - 如何使 Wagtail 搜索不区分大小写

c++ - 使用 Array 填充 List<> 得到错误的数字