Seite 1 von 1

Typenumwandlung

Verfasst: Dienstag 13. Februar 2007, 10:25
von zed leppelin
Hallo,

ich will eine Liste mit Zahlen (Strings) umwandeln in eine Liste mit Integern und mache das so:

Code: Alles auswählen

zahlen = ['2','3','5','7','8','9']

zahlen_ints = [int(item)
               for item in zahlen]
Geht das auch direkter. Evtl sogar ohne eine neue Liste zu erzeugen?

Vielen Dank für Tips.

Zed

Re: Typenumwandlung

Verfasst: Dienstag 13. Februar 2007, 10:33
von sape
zed leppelin hat geschrieben:[...]
Evtl sogar ohne eine neue Liste zu erzeugen?
[...]
So,

Code: Alles auswählen

zahlen = ['2','3','5','7','8','9']
zahlen = [int(item) for item in zahlen]
oder so.

Code: Alles auswählen

zahlen = ['2','3','5','7','8','9']
zahlen = map(int, zahlen)

Verfasst: Dienstag 13. Februar 2007, 10:38
von jens
[wiki]Tutorial/Listen[/wiki] :lol:

Verfasst: Dienstag 13. Februar 2007, 10:56
von sape
jens hat geschrieben:[wiki]Tutorial/Listen[/wiki] :lol:
Und das hat mit der Frage, genau was zu tun?

Verfasst: Dienstag 13. Februar 2007, 11:20
von zed leppelin
Vielen Dank.

Re: Typenumwandlung

Verfasst: Dienstag 13. Februar 2007, 15:12
von Leonidas
sape hat geschrieben:
zed leppelin hat geschrieben:[...]
Evtl sogar ohne eine neue Liste zu erzeugen?
[...]
So,

Code: Alles auswählen

zahlen = ['2','3','5','7','8','9']
zahlen = [int(item) for item in zahlen]
oder so.

Code: Alles auswählen

zahlen = ['2','3','5','7','8','9']
zahlen = map(int, zahlen)
Erstellt aber beides neue Listen, ersteres ist eigentlich der gleiche Code den der OP schon im ersten Beitrag geschrieben hat.

Verfasst: Dienstag 13. Februar 2007, 16:10
von rayo
Hi

Code: Alles auswählen

for x,value in enumerate(zahlen):
    zahlen[x] = int(value)
So?

Gruss

Verfasst: Dienstag 13. Februar 2007, 16:21
von jens
Dann schauen wir doch mal:

Code: Alles auswählen

from benchmark import Benchmark

def f1(loops):
    for i in xrange(loops):
        zahlen = ['2','3','5','7','8','9']
        zahlen = [int(item) for item in zahlen]

def f2(loops):
    for i in xrange(loops):
        zahlen = ['2','3','5','7','8','9']
        for x,value in enumerate(zahlen):
            zahlen[x] = int(value)

loops = 100000
bench = Benchmark()
bench.add_function(f1, "LC", loops)
bench.add_function(f2, "enumerate", loops)

bench.run()
bench.print_ranking()
benchmark.py ist: http://paste.pocoo.org/show/83/ siehe http://www.python-forum.de/viewtopic.php?p=58861#58861

Ergebnis:
[Die Laufzeit wird ermittelt]
run: f1 - LC OK (0.60sec.)
run: f2 - enumerate OK (0.64sec.)

[Ranking wird erzeugt]
Ranking wurde erzeugt.
-------------------------------------------------------------------------------
Funktion: f2 - enumerate ist am langsamsten; Zeit: 0.640705 sec
Funktion: f1 - LC ist um 6.38% schneller; Zeit: 0.602306 sec
-------------------------------------------------------------------------------

Verfasst: Dienstag 13. Februar 2007, 16:28
von Luzandro
Benchmark ist hier aber IMHO relativ egal - einen Unterschied macht es allerdings, wenn du mehrere Referenzen darauf hast und den Inhalt ändern willst, anstatt "zahlen" an etwas anderes zu binden

Verfasst: Dienstag 13. Februar 2007, 16:32
von jens
Kommt halt darauf an, was man machen möchte ;)

Re: Typenumwandlung

Verfasst: Dienstag 13. Februar 2007, 17:47
von sape
Leonidas hat geschrieben:[...]
Erstellt aber beides neue Listen, ersteres ist eigentlich der gleiche Code den der OP schon im ersten Beitrag geschrieben hat.
Ja, ganz korrekt betrachtet wird eine neue Liste in beiden Varianten erstellt und an den bisherigen Namen gebunden. Hängt aber davon ab von welcher Ebene man das betrachten **möchte** und wie man seine Frage nun interpretieren möchte.

Und ich habe das halt von der Ebene betrachtet,
Evtl sogar ohne eine neue Liste zu erzeugen?
dass halt keine liste erzeugt wird die an einen neuen Namen gebunden wird wie hier...

Code: Alles auswählen

zahlen = ['2','3','5','7','8','9']

zahlen_ints = [int(item)
               for item in zahlen]
...sondern das der bisherige Name ``zahlen`` beibehalten wird für die neue Liste.


Ich weiß nicht ob man nun die Frage so penible auffasen sollte, wie Du, da ich mit 90%iger Wahrscheinlichkeit davon ausgehen das er das gar nicht so meinte?


Aber korrekterweise wird (Vereinfacht dargestellt) über das Objekt das an den Namen Zahlen gebunden ist iteriert und in ein neues Objekt transferiert. Dieses neue Objekt wird an den Namen ``Zahlen`` gebunden. Da nun kein anderer Name auf das alte Objekt zeigt, fällt es dem GC zu opfer. -- In wie Fern ist da aber nun relevant das so penibel zu betrachten?

Re: Typenumwandlung

Verfasst: Dienstag 13. Februar 2007, 17:54
von Leonidas
sape hat geschrieben:Ich weiß nicht ob man nun die Frage so penible auffasen sollte, wie Du, da ich mit 90%iger Wahrscheinlichkeit davon ausgehen das er das gar nicht so meinte?
Ich finde das gar nichgt mal so penibel - ich unterstelle dem OP mal, dass auf den tollen Trick die alte Liste mit der neuen er auch schon gekommen wäre. Ist ja nichts besonderes.

Code: Alles auswählen

a = 1
a = 2
Oha!

Re: Typenumwandlung

Verfasst: Dienstag 13. Februar 2007, 17:57
von sape
Leonidas hat geschrieben:[...]

Code: Alles auswählen

a = 1
a = 2
Oha!
Warum Oha?

Re: Typenumwandlung

Verfasst: Dienstag 13. Februar 2007, 18:12
von Redprince
Moinsen...
sape hat geschrieben:Warum Oha?
Leonidas hat geschrieben:Ist ja nichts besonderes.

Re: Typenumwandlung

Verfasst: Dienstag 13. Februar 2007, 19:03
von sape
Ah, da hat jemand Mulitaccs ;)

Re: Typenumwandlung

Verfasst: Dienstag 13. Februar 2007, 19:26
von pyStyler
sape hat geschrieben:Ah, da hat jemand Mulitaccs ;)
wie hast Du das rausbekommen?
Du hast doch keine Admin rechte oder doch?

Re: Typenumwandlung

Verfasst: Dienstag 13. Februar 2007, 20:35
von Leonidas
sape hat geschrieben:Ah, da hat jemand Mulitaccs ;)
Habe jetzt einige Zeit gebraucht um zu verstehen was Mulitaccs sein soll. Wie dem auch sei, Redprince hat genau das angesprochen was ich mit meinem Post gemeint habe.