Dezimale Alignment-Formatierung in Python

8

Dies sollte einfach sein.

Hier ist mein Array (eher eine Methode zum Erzeugen repräsentativer Test-Arrays):

%Vor%

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

%Vor%

Ich möchte nach links und > nach rechts (aber nicht mehr als nötig)

Ich will eine Null nach dem Dezimaltrennzeichen, wenn das alles nach dem Dezimaltrennzeichen ist.

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's %g, %fx.x , etc. sind entweder verwirrend oder können es nicht tun. Ich habe import decimal noch nicht ausprobiert. Ich kann nicht sehen, dass NumPy es auch tut (obwohl die array.__str__ und array.__repr__ dezimal ausgerichtet sind (aber manchmal wieder wissenschaftlich).

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

Meine aktuellen Lösungsansätze sind:

  1. to str (a) und zerschneiden NumPy Klammern
  2. str (e) jedes Element im Array und split ('.') dann pad und rekonstruieren
  3. zu einem.type ('S' + str (i)), wobei i das Maximum ist (len (str (a))), dann pad

Es scheint so, als ob es draußen eine Lösung von der Stange geben sollte ... (aber nicht erforderlich)

Der oberste Vorschlag schlägt fehl, wenn dtype float64:

ist %Vor%     
Paul 22.06.2009, 03:34
quelle

2 Antworten

9

Entschuldigung, aber nach eingehender Untersuchung kann ich keine Möglichkeit finden, die Aufgabe, die Sie benötigen, ohne ein Minimum an Nachbearbeitung auszuführen (um die abschließenden Nullen zu entfernen, die Sie nicht sehen wollen); etwas wie:

%Vor%

ist schnell und prägnant, aber bricht Ihre Beschränkung von "von der Stange" - es ist stattdessen eine modulare Kombination von allgemeinen Formatierung (die fast das tut, was Sie wollen, aber hinter Null lässt, die Sie ausblenden möchten) und ein RE, um unerwünschte nachgestellte Nullen zu entfernen. Praktisch denke ich, dass es genau das tut, was Sie benötigen, aber Ihre Bedingungen sind, wie ich glaube, übermäßig eingeschränkt.

Bearbeiten : Die ursprüngliche Frage wurde bearbeitet, um signifikantere Ziffern anzugeben, benötigt keinen zusätzlichen Leerzeichen mehr als für die größte Zahl erforderlich ist, und liefert ein neues Beispiel (wobei mein vorheriger Vorschlag oben nicht zutrifft). t stimmen mit der gewünschten Ausgabe überein. Das Entfernen von führenden Leerzeichen, die einem Strings-String gemeinsam sind, erfolgt am besten mit textwrap.dedent - aber das arbeitet an einer einzelnen Zeichenfolge (mit Zeilenumbrüchen), während die erforderliche Ausgabe eine Liste von Zeichenfolgen ist. Kein Problem, wir werden die Zeilen einfach zusammenfügen, sie verstecken und wieder aufteilen:

%Vor%

sendet:

%Vor%     
Alex Martelli 22.06.2009, 05:07
quelle
2

Die Formatierung von Pythons-Zeichenfolgen kann sowohl nur die erforderlichen Dezimalstellen (mit% g) als auch eine feste Anzahl von Dezimalstellen (mit% f) ausgeben. Sie möchten jedoch nur die erforderlichen Dezimalstellen ausdrucken, außer wenn die Zahl eine ganze Zahl ist, dann wollen Sie eine Dezimalzahl, und das macht es komplex.

Dies bedeutet, dass Sie mit etwas enden würden wie:

%Vor%

Dies erzeugt zuerst eine Zeichenkette mit einer Dezimalzahl, wenn der Wert eine ganze Zahl ist, oder sie druckt mit automatischen Dezimalzahlen (aber nur bis zu 10 Zahlen), wenn es sich nicht um eine Bruchzahl handelt. Zuletzt wird es gedruckt, angepasst, so dass der Dezimalpunkt ausgerichtet wird.

Wahrscheinlich funktioniert numpy jedoch genau so, wie Sie es möchten, weil Sie es normalerweise im Exponentialmodus haben möchten, wenn es zu lang ist.

    
Lennart Regebro 22.06.2009 06:33
quelle

Tags und Links