Python中的十进制对齐格式

Pau*_*aul 8 python formatting numpy code-golf

应该很容易.

这是我的数组(相反,一种生成代表性测试数组的方法):

>>> ri = numpy.random.randint
>>> ri2 = lambda x: ''.join(ri(0,9,x).astype('S'))
>>> a = array([float(ri2(x)+ '.' + ri2(y)) for x,y in ri(1,10,(10,2))])
>>> a
array([  7.99914000e+01,   2.08000000e+01,   3.94000000e+02,
         4.66100000e+03,   5.00000000e+00,   1.72575100e+03,
         3.91500000e+02,   1.90610000e+04,   1.16247000e+04,
         3.53920000e+02])
Run Code Online (Sandbox Code Playgroud)

我想要一个字符串列表,其中'\n'.join(list_o_strings)将打印:

   79.9914
   20.8
  394.0
 4661.0
    5.0
 1725.751
  391.5
19061.0
11624.7
  353.92
Run Code Online (Sandbox Code Playgroud)

我想空间垫的左侧右侧(但没有超过必要的).

如果小数点后面的所有内容,我想在小数点后面加零.

我不想要科学记谱法.

..我不想丢失任何有效数字.(在353.98000000000002中2表示不重要)

是的,很高兴想要..

Python 2.5 %g, %fx.x等等要么迷惑我,要么无法做到.我还没有尝试过import decimal.我看不出NumPy是这样做的(虽然,array.__str__array.__repr__十进制对齐(但有时会返回科学).

哦,速度很重要.我在这里处理大阵列.

我目前的解决方案是:

  1. str(a)和解析NumPy的括号
  2. str(e)数组中的每个元素并拆分('.')然后填充和重建
  3. 到a.astype('S'+ str(i)),其中i是max(len(str(a))),然后填充

似乎应该有一些现成的解决方案......(但不是必需的)

最佳建议失败,何时dtype是float64:

>>> a
array([  5.50056103e+02,   6.77383566e+03,   6.01001513e+05,
         3.55425142e+08,   7.07254875e+05,   8.83174744e+02,
         8.22320510e+01,   4.25076609e+08,   6.28662635e+07,
         1.56503068e+02])
>>> ut0 = re.compile(r'(\d)0+$')
>>> thelist = [ut0.sub(r'\1', "%12f" % x) for x in a]
>>> print '\n'.join(thelist)
  550.056103
 6773.835663
601001.513
355425141.8471
707254.875038
  883.174744
   82.232051
425076608.7676
62866263.55
  156.503068
Run Code Online (Sandbox Code Playgroud)

Ale*_*lli 10

对不起,经过彻底的调查后,我找不到任何方法来执行你需要的任务,而不需要进行最少的后处理(剥去你不想看到的尾随零); 就像是:

import re
ut0 = re.compile(r'(\d)0+$')

thelist = [ut0.sub(r'\1', "%12f" % x) for x in a]

print '\n'.join(thelist)
Run Code Online (Sandbox Code Playgroud)

是快速和简洁的,但打破了你的"现成"的限制 - 相反,它是一般格式的模块化组合(几乎可以做你想要的但是留下你要隐藏的零尾)和一个RE删除不需要的尾随零.实际上,我认为它完全符合您的要求,但我认为您所陈述的条件过度约束.

编辑:编辑原始问题以指定更多有效数字,不需要超出最大数字所需的额外前导空间,并提供一个新示例(上面我的上一个建议与所需输出不匹配).删除对一串字符串通用的前导空格的工作最好使用textwrap.dedent执行- 但它适用于单个字符串(使用换行符),而所需输出是字符串列表.没问题,我们只是将这些线条放在一起,然后再将它们分开,然后再将它们分开:

import re
import textwrap

a = [  5.50056103e+02,   6.77383566e+03,   6.01001513e+05,
         3.55425142e+08,   7.07254875e+05,   8.83174744e+02,
         8.22320510e+01,   4.25076609e+08,   6.28662635e+07,
         1.56503068e+02]

thelist = textwrap.dedent(
        '\n'.join(ut0.sub(r'\1', "%20f" % x) for x in a)).splitlines()

print '\n'.join(thelist)
Run Code Online (Sandbox Code Playgroud)

发出:

      550.056103
     6773.83566
   601001.513
355425142.0
   707254.875
      883.174744
       82.232051
425076609.0
 62866263.5
      156.503068
Run Code Online (Sandbox Code Playgroud)