Liste von strings in Liste mit Zahlen konvertieren!?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

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!
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

was soll es denn werden, wenn kein float?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Naja, es gäbe da ja noch "complex" :D
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

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.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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:
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Vielleicht wäre ja auch das decimal-Modul etwas für dich.

Gruss
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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.
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
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.
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

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