回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>这应该很容易。</p>
<p>这是我的数组(更确切地说,是生成代表性测试数组的方法):</p>
<pre><code>>>> 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])
</code></pre>
<p>我想要一个字符串列表,其中'\n'。join(list_o_strings)将打印:</p>
<pre><code> 79.9914
20.8
394.0
4661.0
5.0
1725.751
391.5
19061.0
11624.7
353.92
</code></pre>
<p>我想把pad放在左边的<em>和右边的</em>之间(但不超过必要的范围)。</p>
<p>我想在小数点后加一个零,如果这就是小数点后的全部。</p>
<p>我不想要科学记数法。</p>
<p>…我不想丢失任何有效数字。(在353.9800000000002中,2不重要)</p>
<p>是啊,很高兴。。</p>
<p>Python 2.5的<code>%g, %fx.x</code>等要么让我困惑,要么做不到。
我还没有试过<code>import decimal</code>。我看不出<a href="http://en.wikipedia.org/wiki/NumPy" rel="noreferrer">NumPy</a>也这样做(尽管<code>array.__str__</code>和<code>array.__repr__</code>是十进制对齐的(但有时返回科学值)。</p>
<p>哦,速度很重要。我在处理大数组。</p>
<p>我目前的解决方法是:</p>
<ol>
<li>str(a)并解析NumPy的方括号</li>
<li>将数组中的每个元素str(e)并拆分('.'),然后填充并重新构造</li>
<li>到a.astype('S'+str(i)),其中i是max(len(str(a)),然后pad</li>
</ol>
<p>似乎应该有现成的解决方案。。。(但不是必需的)</p>
<p>当<code>dtype</code>为float64时,顶部建议失败:</p>
<pre><code>>>> 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
</code></pre>