Форматирование десятичного выравнивания в Python

этоshould расслабьтесь.

Вот мой массив (точнее, метод генерации репрезентативных тестовых массивов):

<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>

Я хочу получить список строк, в которых «\ n» .join (list_o_strings) будет печатать:

<code>   79.9914
   20.8
  394.0
 4661.0
    5.0
 1725.751
  391.5
19061.0
11624.7
  353.92
</code>

Я хочу, чтобы пробел слеваand право (но не более чем необходимо).

Я хочу ноль после десятичной дроби, если это все, что после десятичной дроби.

Я не хочу научных обозначений.

..и я не хочу терять какие-либо существенные цифры. (в 353.98000000000002 значение 2 не имеет значения)

Да, это приятно хотеть ..

Python 2.5%g, %fx.xи т.д. либо смущают меня, либо не могут этого сделать. Я не пробовалаimport decimal еще. Я не вижу этогоNumPy это тоже (хотя,array.__str__ а такжеarray.__repr__ выровнены по десятичной дроби (но иногда возвращают научную).

Ох, и скорость имеет значение. Я имею дело с большими массивами здесь.

Мои текущие подходы к решению:

to str(a) and parse off NumPy's brackets to str(e) each element in the array and split('.') then pad and reconstruct to a.astype('S'+str(i)) where i is the max(len(str(a))), then pad

Кажется, должно быть какое-то готовое решение там ... (но не обязательно)

Лучшее предложение проваливается с тем, когдаdtype это float64:

<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>

Ответы на вопрос(2)

Ваш ответ на вопрос