Python中的小数对齐格式
问题内容:
这 应该 很容易。
这是我的数组(而是一种生成代表性测试数组的方法):
>>> 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])
我想要一个将在其中打印\\ 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
我想空间垫的左侧 和 右侧(但不超过必要)。
我要在小数点后为零,如果那是所有在小数点后的话。
我不要科学记数法。
..并且我不想丢失任何有效数字。(在353.98000000000002中2不重要)
是的,很高兴..
Python 2.5的%g, %fx.x
等等使我迷惑,或者无法做到。我还没有尝试过import decimal
。我也看不到NumPy这样做(尽管array.__str__
and和array.__repr__
是十进制对齐的(但有时返回科学值)。
哦,速度很重要。我在这里处理大型数组。
我当前的解决方案是:
- str(a)并解析NumPy的括号
- 来str(e)数组中的每个元素并拆分(’。’),然后填充并重建
- 到a.astype(’S’+ str(i)),其中i是max(len(str(a))),然后填充
似乎应该有一些现成的解决方案……(但不是必需的)
最佳建议失败于whendtype
是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
问题答案:
抱歉,但是经过深入研究,如果没有最少的后处理(去除您不希望看到的尾随零),我将找不到任何方法来执行您所需的任务;就像是:
import re
ut0 = re.compile(r'(\d)0+$')
thelist = [ut0.sub(r'\1', "%12f" % x) for x in a]
print '\n'.join(thelist)
既快速又简洁,但打破了“现成”的限制-
相反,它是常规格式(几乎可以满足您的要求,但尾随的零要隐藏)和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)
发出:
550.056103
6773.83566
601001.513
355425142.0
707254.875
883.174744
82.232051
425076609.0
62866263.5
156.503068