Seite 1 von 1

Liste von strings in Liste mit Zahlen konvertieren!?

Verfasst: Donnerstag 15. November 2007, 15:24
von acidk
Hallo Leute!
Ich möchte eine Liste mit Stings:

Code: Alles auswählen

a =['17.990', '55.140', '3.650', '5.000']
in eine Liste mit Zahlen konvertieren....
(im P-Tutorial stehts nur anders herum; round oder int hilft mir nicht, und ein float soll es nicht werden! )

Hoffe, Ihr könnt mir helfen!

Thanx!

Verfasst: Donnerstag 15. November 2007, 15:26
von meneliel
was soll es denn werden, wenn kein float?

Verfasst: Donnerstag 15. November 2007, 15:29
von gerold
meneliel hat geschrieben:was soll es denn werden, wenn kein float?
Mir fällt da nur noch *decimal.Decimal* als möglichen Typ ein.

lg
Gerold
:-)

Verfasst: Donnerstag 15. November 2007, 15:30
von EyDu
Naja, es gäbe da ja noch "complex" :D

Verfasst: Donnerstag 15. November 2007, 15:33
von gerold
EyDu hat geschrieben:Naja, es gäbe da ja noch "complex" :D
Mich würde es ja nicht wundern, wenn hier noch ein paar mögliche Datentypen auftauchen. 8)

mfg
Gerold
:-)

Verfasst: Donnerstag 15. November 2007, 15:36
von EyDu
gerold hat geschrieben:Mich würde es ja nicht wundern, wenn hier noch ein paar mögliche Datentypen auftauchen. 8)
Ziel muss es ja auch sein, alle verfügbaren zahlenartigen Datentypen der Vollständigkeit halber aufzuführen. Oder zumindest nahe an die Vollständigkeit zu kommen :D

Verfasst: Donnerstag 15. November 2007, 15:38
von acidk
Ich dachte an eine Dezimalzahl(???); bei floats habe ich ja wieder Unmengen an Nachkommastellen - da sollten es nur die drei bleiben.

Das war auch ein Grund, warum ich über die "String" Variante gegangen bin - um dieses Problem (Formatierung) nicht zu haben und die Liste weiterhin durchiterieren zu können.

Verfasst: Donnerstag 15. November 2007, 15:40
von gerold
Es soll ja nur kein Float werden, richtig? :D

Code: Alles auswählen

>>> class KeinFloat(float):
...     pass
...     
>>> a =['17.990', '55.140', '3.650', '5.000']
>>> for index, item in enumerate(a):
...     a[index] = KeinFloat(item)
...     
>>> a
[17.989999999999998, 55.140000000000001, 3.6499999999999999, 5.0]
>>> type(a[1])
<class '__main__.KeinFloat'>
>>> 
mfg
Gerold
:mrgreen:

Verfasst: Donnerstag 15. November 2007, 15:43
von Rebecca
Floats sind Dezimalzahlen, und sie werden immer mit den vielen Nachkommastellen gespeichert. Das einzige, was du beeinflussen kannst, ist, mit wie vielen Nachkommastellen du sie ausgibst:

Code: Alles auswählen

>>> x = 3.2
>>> print x
3.2
>>> print "%.3f" % x
3.200
>>> print repr(x)
3.2000000000000002
>>>
Wenn du eine Liste mit zahlen printest, wird uebrigens die repr-Funktion fuer die Ausgabe der Zahlen verwendet.

Verfasst: Donnerstag 15. November 2007, 15:44
von gerold
PS: Die Ausgabe sollte erst dann das Thema sein, wenn es zur Ausgabe kommt. Du kannst ja nicht immer alles als Text mitschleppen und damit rechnen, nur weil du es im Endeffekt mit drei Kommastellen ausgeben möchtest.

Code: Alles auswählen

>>> for item in a:
...     print item
...     print "%.1f" % item
...     
17.99
18.0
55.14
55.1
3.65
3.6
5.0
5.0
>>> 
mfg
Gerold
:-)

Verfasst: Donnerstag 15. November 2007, 16:12
von rayo
Vielleicht wäre ja auch das decimal-Modul etwas für dich.

Gruss

Verfasst: Donnerstag 15. November 2007, 16:18
von veers

Code: Alles auswählen

b = map(float, a)
Das die Nachkommastellen nur eine Darstellungssache sind wurde ja bereits gesagt.

Die alternative wäre Decimal. Das arbeiten mit Decimals ist jedoch ziemlich langsam. Kann aber nützlich sein wenn du mit Zahlen rechnest wo du dir keine Rundungsfehler erlauben kannst.

Verfasst: Donnerstag 15. November 2007, 16:23
von BlackJack
Brüche sind auch ganz lustig. ;-)

Code: Alles auswählen

In [301]: map(gmpy.mpq, ['17.990', '55.140', '3.650', '5.000'])
Out[301]: [mpq(1799,100), mpq(2757,50), mpq(73,20), mpq(5)]
Ansonsten schliesse ich mich der Meinung an, das man in der Regel `float` möchte und sich um die Darstellung erst kümmern sollte, wenn die auch wirklich ansteht. Es scheint hier ja nicht um die Rechenungenauigkeiten von `float`\s zu gehen, die spielen sich in der Regel nicht in den ersten drei Nachkommastellen ab. Dafür auf `decimal` zurück zu greifen ist Overkill.

Verfasst: Donnerstag 15. November 2007, 18:15
von acidk
okay - vielleicht nochmal genauer zu meinem Problem (ich hoffe, dass liest hier noch irgend jemand...)

Ich möchte zwei Punktwolken miteinander vergleichen(bestehen aus x/y/z Koordinaten +einem Interaktionswert [Gridsonde zu einer Aminosäure in einem Protein).

Ich lese sie aus einer Datei aus und bekomme einen String. In jeder Zeile stehen also 3 Kordinaten +ein Interaktionswert.
Nun generiere ich alle möglichen 3 Punkt Kombinationen.
Nun hab ich Listen mit den Koordinaten der Energie+3 Punkte .

Code: Alles auswählen

'[[-0.068, 2.650, 53.140, 12.990], [-0.392, -4.350, 52.140, 11.990], [-0.748, 0.650, 52.140, 11.990]]'
(davon ein paar 1000. Elemente....

Das klappt alles noch,

Um unabhängig von den absoluten Koordinaten zu werden will ich die Euklidischen Distanzen der Punkte zueinander berechnen ; pos.1 summiere ich = Summe der Interaktionen. Hieraus würde ich mir einen array mit 4. Pos machen: 1x Interaktion + 3 Kanten.
Für die andere Punktwolke das Gleiche, am Ende vergleiche ich die Arrays miteinander( wieder Euklid Dist, jeder mit jedem).

aber: ich weiß nicht wie ich die Elemente der Liste so umwandle, das ich vernünftig damit rechnen kann. Ich hatte gehofft die Einzelnen Elemente mit numpy in arrays umzuwandeln - eine Liste mit arrays also. Dann könnte ich zumindest die Distanzen berechnen... klappt nur leider nicht....

Verfasst: Donnerstag 15. November 2007, 19:15
von BlackJack
Die Beschreibung hat jetzt aber irgendwie gar nichts mit den drei Nachkommastellen zu tun.

Und vernünftig Rechnen lässt sich mit `float`, dazu sind die schliesslich da.