Форматирование десятичного выравнивания в 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>