“表格”Python cod的自动对齐

2024-04-23 22:27:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些Python代码如下所示:

rates = {3: [((17500, 99999), Decimal('23425.00'), Decimal('7234.24'))],
         4: [((    0,  3510), Decimal( '4563.00'), Decimal('5234.00')),
             (( 3510, 17500), Decimal('34578.00'), Decimal('3464.50')),
             ((17500, 99999), Decimal('18268.00'), Decimal('5734.66'))],
         5: [((17500, 99999), Decimal('83564.00'), Decimal('3475.60'))]}

注意,小数点是围绕小数点对齐的,而整数是右对齐的。在

有没有一些软件可以自动执行这种复杂的校准?我会对任何接近的东西感兴趣,即使它不能完全符合上面的要求。在


Tags: 代码软件整数感兴趣decimal校准rates我会
3条回答

我也遇到了同样的问题。管理层希望从某种表格格式的数据中打印出一份漂亮的报告。在

我不想只做一堆带有“魔力”空格的print语句来修复对齐,所以我想出了一个python函数:

def column(filename, data, indent=0):
    """This function takes a list of lists and produces columized output"""
    # get the width of the columns
    width = []
    for mylist in data:
        for count, d in enumerate(mylist):
            if count > (len(width)-1):
                width.append(len(str(d)))
            elif len(str(d)) > width[count]:
                width[count] = len(str(d))
    # print the data
    for mylist in data:
        line = '{0:<{indent}}'.format('', indent=indent)    
        for count, d in enumerate(mylist):
            try:
                line = '%s%s' % (line, '{0:{w},} '.format(d, w=width[count]))
            except ValueError, e:
                line = '%s%s' % (line, '{0:{w}} '.format(d, w=width[count]))
        filename.write(line)
        filename.write('\n')

它不是完美的,你需要调整它来产生你想要的输出。最具体地说,它当前需要一个列表,因为我希望以特定的顺序传递,而字典没有被排序。在

虽然标准库pprint模块将添加空白以使字典和列表在屏幕上至少看起来合理,但我不知道有什么东西可以,例如,认为字符串常量中的句点是有效的,并添加足够的空白来对齐它们!除非我大错特错,否则您可能总是手工在Python中进行这种对齐。在

如果您将这些值存储在一个单独的纯文本表文件中,那么,当然,您可能会找到几个愿意帮助您对齐小数点的编辑器。在

注意:我不认为以下是特别明智的。)

在大多数情况下,如果您只是键入原始代码(大多数编辑器都会帮助您对齐dict和列表项),您应该得到这样的结果:

rates = {3: [((17500, 199999), Decimal('23425.00'), Decimal('7234.245'))],
         4: [((0, 3510), Decimal('4563.00'), Decimal('5234.00')),
             ((3510, 17500), Decimal('34578.00'), Decimal('464.50')),
             ((17500, 99999), Decimal('18268.00'), Decimal('5734.66'))],
         15: [((17500, 99999), Decimal('83564.00'), Decimal('3475.60'))]}

(我将一些值变长,一些值变短,以增加一点古怪。)

使用用于Vim的Tabular插件,在上面的代码上按顺序执行以下命令(您可能希望可视化地阻止它),将以与您最初的问题相匹配的方式格式化上述代码:

^{pr2}$

操作包括:

  1. 对齐第一个[s和(s
  2. 对齐第一个(s,这将修复与第一个操作的不对齐。在
  3. 右对齐(17500,上的类似于,的值。在
  4. 右对齐, 99999)上的类似于,的值。在
  5. '4563.00'类值对齐.。在

您可以制作一个在普通和可视模式下使用的映射:

noremap <leader>ff :Tab /^[^[(]*\zs[[(]/l0<CR>
                  \:Tab /^[^(]*\zs(/l0<CR>
                  \:Tab /(\zs\d\+\s*,/l0r1<CR>
                  \:Tab /,\s*\zs\d\+)/l1r0<CR>
                  \:Tab /['"]\d*\ze\.\d*['"]/l0r0<CR>

最终结果:

rates = {3:  [((17500, 199999), Decimal('23425.00'), Decimal('7234.245'))],
         4:  [((    0,   3510), Decimal( '4563.00'), Decimal('5234.00')),
              (( 3510,  17500), Decimal('34578.00'), Decimal( '464.50')),
              ((17500,  99999), Decimal('18268.00'), Decimal('5734.66'))],
         15: [((17500,  99999), Decimal('83564.00'), Decimal('3475.60'))]}

显然,这些操作的有效性取决于代码的结构和原始格式,但希望这能启发您。在

相关问题 更多 >