Formatierung der Dezimalausrichtung in Python

Diesesollte sei einfach.

Hier ist mein Array (eher eine Methode zum Generieren repräsentativer Testarrays):

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

Ich möchte eine Liste von Zeichenfolgen, in die '\ n'.join (list_o_strings) drucken würde:

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

Ich möchte ein Leerzeichen nach links setzenund das richtige (aber nicht mehr als nötig).

Ich möchte eine Null nach dem Komma, wenn das alles ist, was nach dem Komma steht.

Ich möchte keine wissenschaftliche Notation.

..und ich möchte keine signifikanten Ziffern verlieren. (in 353.98000000000002 ist die 2 nicht signifikant)

Ja, es ist schön zu wollen ..

Python 2.5%g, %fx.xusw. verwirren mich entweder oder können es nicht. Ich habe es nicht versuchtimport decimal noch. Ich kann das nicht sehenNumPy tut es auch (obwohl diearray.__str__ undarray.__repr__ sind dezimal ausgerichtet (geben aber manchmal wissenschaftliche Ergebnisse zurück).

Oh, und Geschwindigkeit zählt. Ich habe es hier mit großen Arrays zu tun.

Meine aktuellen Lösungsansätze sind:

um (a) zu stren und NumPys Klammern zu entfernenum (e) jedes Element im Array zu markieren und zu teilen ('.'), dann aufzufüllen und zu rekonstruierenzu a.astype ('S' + str (i)), wobei i das Maximum ist (len (str (a))), dann pad

Es scheint, als sollte es eine Standardlösung geben ... (aber nicht erforderlich)

Top Vorschlag scheitert mit wanndtype ist 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>

Antworten auf die Frage(2)

Ihre Antwort auf die Frage