【问题标题】:How to align numbers by decimal position?如何按小数位对齐数字?
【发布时间】:2016-08-01 22:14:56
【问题描述】:

我的桌子:

  2       4,5   100    400
  3        20    10    100
4,2    10.000   500    600
9,2  10.024,5   610  1.100

mylist = [['2', '4,5', '100', '400'], ['3', '20', '10', '100'], ['4,2', '10.000', '500', '600'], ['9,2', '10.024,5', '610', '1.100']]

我怎样才能像这样对齐数字:

2         4,5  100    400
3        20     10    100
4,2  10.000    500    600
9,2  10.024,5  610  1.100

我做了什么:

for i in range(0, len(mylist)):
    '{:>10} {:>10} {:>10} {:>10}'.format(mylist[i][0], mylist[i][1], mylist[i][2], mylist[i][3])

这给出了第一张表中的上述结果,但小数点未对齐。

更新
我根据任何列表中元素的长度调整了弗朗西斯科的解决方案。

mylist = [['1300', '300', '300'], ['2300,5', '300,5', '300,5'], ['3600000000000', '6000000', '6000000'], ['4200,2345', '200,2345', '200,2345'], ['5301', '301', '301'], ['6200', '200', '200'], ['7300', '300', '300000000'], ['8300,5', '300,500000', '300,5'], ['960000', '600', '6000'], ['10200,2345', '200999,2345', '200,2345'], ['11301', '301', '301'], ['12200', '200', '200'], ['13300', '300', '300'], ['14300,5', '300,5', '300,5']]

column2row = zip(*mylist)
maxbefore = []
maxafter = []
for m in column2row:
    maxlengthbefore = 0
    maxlengthafter  = 0
    for e in m:
        if ',' in e:
           lengthbefore = len(str(e).split(",")[0])
           if lengthbefore > maxlengthbefore:
              maxlengthbefore = lengthbefore
           lengthafter  = len(str(e).split(",")[1])
           if lengthafter > maxlengthafter:
              maxlengthafter = lengthafter
        else:
           lengthbefore = len(str(e))
           if lengthbefore > maxlengthbefore:
              maxlengthbefore = lengthbefore
    maxbefore.append(maxlengthbefore)
    maxafter.append(maxlengthafter + 1)

for m in mylist:
    r = 0
    for e in m:
        if ',' in e:
            print(e.rjust(int(maxbefore[r]) + len(e) - e.index(',')).ljust(int(maxbefore[r])+int(maxafter[r])), end=' ')
        else:
            print(e.rjust(int(maxbefore[r])).ljust(int(maxbefore[r])+int(maxafter[r])), end=' ')
        r += 1
    print()

输出

         1300          300              300      
         2300,5        300,5            300,5    
3600000000000      6000000          6000000      
         4200,2345     200,2345         200,2345 
         5301          301              301      
         6200          200              200      
         7300          300        300000000      
         8300,5        300,500000       300,5    
       960000          600             6000      
        10200,2345  200999,2345         200,2345 
        11301          301              301      
        12200          200              200      
        13300          300              300      
        14300,5        300,5            300,5

【问题讨论】:

  • 您似乎将, 视为小数点分隔符,但最后一列的最后一行有一个. ...我认为. 没有在这里得到特殊待遇?
  • @mgilson,我使用西欧格式。小数 = ',' 和千位 = '.'

标签: python python-3.x alignment numeric


【解决方案1】:
for m in mylist:
    for e in m:
        if ',' in e:
            print(e.rjust(10 + len(e) - e.index(',')).ljust(15), end=' ')
        else:
            print(e.rjust(10).ljust(15), end=' ')
    print()

打印:

         2               4,5           100             400     
         3              20              10             100     
         4,2        10.000             500             600     
         9,2        10.024,5           610           1.100

基本上它的作用是检查字符串中是否有逗号。

如果是这样,它会检查它的位置,将字符串居中放在右侧,检查有多少个字符,而不计算逗号后的所有内容,然后将其居中到左侧,这次计算逗号后的位置。

如果字符串中没有逗号,它只是将其居中居左和居右。

【讨论】:

  • Francisco,它在我的系统(python3)上不起作用。很多错误。<built-in function print> 4,2 (None,) 10.000 (None,) 500 (None,) 600 (None,)
  • 对不起,我让它与 python 3 一起工作
  • 我想我的问题没有解决办法?
  • 你永远不会在循环中增加r,你必须将maxafter.append(maxlengteafter)更改为maxafter.append(maxlengteafter + 1)
猜你喜欢
  • 2013-04-29
  • 2022-11-18
  • 2021-12-13
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 2017-03-22
  • 1970-01-01
相关资源
最近更新 更多