Seite 1 von 1

wie füge ich an pos 0 einer Liste etwas ein?

Verfasst: Sonntag 24. Juni 2007, 18:28
von jo_hb
Hallo,
absolute anfängerfrage, wahrscheinlich, aber ich find's nicht raus: Wie füge ich einen Wert an Position 0 in eine Liste ein?

also zB:

Code: Alles auswählen

a = [2,4,6,8]
a[:0] = 17
... geht ja leider nicht, weil man nur ein iterable einfügen kann?! Aber es gibt doch sicher ne ganz simple methode dafür, oder nicht?

(Ergebniss soll na klar [17, 2, 4, 6, 8] sein...)

Verfasst: Sonntag 24. Juni 2007, 18:45
von Pyre
mit insert:

Code: Alles auswählen

>>> a = [2, 4, 6, 8]
>>> a.insert(0, 17)
>>> a
[17, 2, 4, 6, 8]

Verfasst: Sonntag 24. Juni 2007, 18:52
von jo_hb
Ah, prima, vielen Dank! :)

Verfasst: Sonntag 24. Juni 2007, 23:23
von mitsuhiko
Und wenn man mehrere Elemente vorne einfügen will am besten einmal reverse machen, dann ein paar mal appenden und dann wieder reverse.

Verfasst: Montag 25. Juni 2007, 07:18
von jens
Da ist die Frage was schneller ist, die reverse-append-reverse Geschichte oder mehrere inserts...

Re: wie füge ich an pos 0 einer Liste etwas ein?

Verfasst: Montag 25. Juni 2007, 10:52
von Michael Schneider
jo_hb hat geschrieben:Hallo,
absolute anfängerfrage, wahrscheinlich, aber ich find's nicht raus: Wie füge ich einen Wert an Position 0 in eine Liste ein?

... geht ja leider nicht, weil man nur ein iterable einfügen kann?! Aber es gibt doch sicher ne ganz simple methode dafür, oder nicht?

(Ergebniss soll na klar [17, 2, 4, 6, 8] sein...)
Hallo Jo,

kein Iterable, ein Listenslice erwartet wieder eine Liste. Aber nichts leichter als das:

Code: Alles auswählen

>>> a = [2, 4, 6, 8]
>>> a
[2, 4, 6, 8]
>>> a[:0] = [17]
>>> a
[17, 2, 4, 6, 8]
Die Antwort auf die Frage von Jens, ob ein Einfügen mit "list.insert(0, ...)" oder mit reverse-append-reverse schneller ist, hängt von der Anzahl der einzufügenden Elemente ab.

Dazu muss man wissen, dass Listen eine Kette von indizierten Elementen darstellen. Hängt man am Anfang (oder in der Mitte) ein Element hinzu, müssen ALLE folgenden Elemente 'angesprungen' und neu indiziert werden. Reverse macht das nur einmal, von vorn bis hinten. Das Neuindizieren sollte also etwa genauso schnell sein, wie beim Einfügen eines neuen Elements am Anfang. Wenn Du zwei Elemente einfügst, hast Du zeitlich schon beide reverses in etwa kompensiert. Mit jedem weiteren eingefügten Element machst Du massig Zeitgewinn, da das einfache Anhängen mit "list.append(...)" am schnellsten geht.

Wenn Du vor hast, eine Liste als Schlange zu implementieren (alle neuen Elemente an den Anfang): mach es nicht mit list.index!!

Es gibt vordefinierte Containerklassen. Schau Dir mal Deque des Moduls collections an: http://docs.python.org/lib/module-collections.html. Die implementiert optimierte Methoden um Objekte hinten (append) und vorn (appendleft) einzufügen. Für threading ist das Modul Queues gedacht.

Grüße,
Michael

Verfasst: Montag 25. Juni 2007, 10:53
von mitsuhiko
jens hat geschrieben:Da ist die Frage was schneller ist, die reverse-append-reverse Geschichte oder mehrere inserts...
Mit dem vierten insert hättest du lieber reverse() gemacht ;)

Re: wie füge ich an pos 0 einer Liste etwas ein?

Verfasst: Montag 25. Juni 2007, 11:09
von birkenfeld
Michael Schneider hat geschrieben: kein Iterable, ein Listenslice erwartet wieder eine Liste.
Doch, schon ein Iterable:

Code: Alles auswählen

a = []
a[0:0] = (1,2,3)
a[0:0] = xrange(5)
etc.

Re: wie füge ich an pos 0 einer Liste etwas ein?

Verfasst: Montag 25. Juni 2007, 12:01
von Michael Schneider
birkenfeld hat geschrieben:
Michael Schneider hat geschrieben: kein Iterable, ein Listenslice erwartet wieder eine Liste.
Doch, schon ein Iterable:

Code: Alles auswählen

a = []
a[0:0] = (1,2,3)
a[0:0] = xrange(5)
etc.
Nein, jedenfalls nicht pauschal (nicht in 2.2 ;-)):
>>> a = []
>>> a[0:0] = (1,2,3)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: must assign list (not "tuple") to slice
Ab welcher Version werden Iterables unterstützt? Ich vermute mal, 2.3.1 - wenn Johannes schon die Bezeichnung "Iterable" in der Exception erhält.

Tja, ich kann nur auswerten, was ich sehe. :)
Michael

Re: wie füge ich an pos 0 einer Liste etwas ein?

Verfasst: Montag 25. Juni 2007, 12:07
von birkenfeld
Michael Schneider hat geschrieben:
birkenfeld hat geschrieben:
Michael Schneider hat geschrieben: kein Iterable, ein Listenslice erwartet wieder eine Liste.
Doch, schon ein Iterable:

Code: Alles auswählen

a = []
a[0:0] = (1,2,3)
a[0:0] = xrange(5)
etc.
Nein, jedenfalls nicht pauschal (nicht in 2.2 ;-)):
*seufz*

Vor du behauptest, irgendetwas gehe nicht,
ist es deine Verantwortung zu prüfen, ob es in einer fünfeinhalb Jahre neueren (!) Version nicht doch geht.

Re: wie füge ich an pos 0 einer Liste etwas ein?

Verfasst: Montag 25. Juni 2007, 12:28
von Michael Schneider
birkenfeld hat geschrieben:
Michael Schneider hat geschrieben:
birkenfeld hat geschrieben:
Michael Schneider hat geschrieben: kein Iterable, ein Listenslice erwartet wieder eine Liste.
Doch, schon ein Iterable:

Code: Alles auswählen

a = []
a[0:0] = (1,2,3)
a[0:0] = xrange(5)
etc.
Nein, jedenfalls nicht pauschal (nicht in 2.2 ;-)):
*seufz*

Vor du behauptest, irgendetwas gehe nicht,
ist es deine Verantwortung zu prüfen, ob es in neueren Versionen etwa doch geht.
Ok, ich hätte schreiben sollen "erwartete eine Liste", wenn ich weiß, dass ich eine ältere Version verwende. Aber abgesehen davon ist meine Kernaussage richtig.
Ich frage mich, warum ich allein in die Verantwortung genommen werde zu prüfen, ob und wann es später mal funktioniert, solange jeder sagen kann, man solle hier und da enumerate, sorted(key...) etc. verwenden, ohne anzugeben, AB wann die Aussage stimmt oder man die Lösung verwenden kann.

Eigentlich ist das eher eine rethorische Frage, aber man sollte trotzdem mal darüber nachdenken. Dass nicht alle die neueste Version verwenden ist logisch und kann nicht vorausgesetzt werden. Doch ab wann muss oder sollte man sagen, dass die Aussage an bestimmte Versionsvoraussetzungen geknüpft ist?

Grüße,
Michael

ps. Ich habe nicht vor, hier den Rechthaber zu spielen. Vielmehr möchte ich diese mich schon lange beschäftigende Frage ausdiskutieren. Neues Thema? Offtopic?

Re: wie füge ich an pos 0 einer Liste etwas ein?

Verfasst: Montag 25. Juni 2007, 14:29
von birkenfeld
Michael Schneider hat geschrieben: Ich frage mich, warum ich allein in die Verantwortung genommen werde zu prüfen, ob und wann es später mal funktioniert, solange jeder sagen kann, man solle hier und da enumerate, sorted(key...) etc. verwenden, ohne anzugeben, AB wann die Aussage stimmt oder man die Lösung verwenden kann.
Meiner Meinung nach ist es eben für einen Anfänger und dessen Freude am Programmieren schlechter, wenn er gesagt bekommt, dies und das funktioniere nicht, obwohl es geht.

Wenn ich sorted() vorschlage und er eine Fehlermeldung bekommt, kann ich immernoch nachschlagen, wann sorted eingeführt wurde.

Re: wie füge ich an pos 0 einer Liste etwas ein?

Verfasst: Montag 25. Juni 2007, 14:38
von Sr4l
Ich glaube du bist der letze Python 2.2 User hier im Forum :-)
Die breite Masse wird 2.4.X und 2.5.X haben.

Wenn du mit Programmieren anfängst würdest du dir die neuster Version herunterladen oder die Vor-vor-vorgänger Version? (rein rhetorische Frage ;-))

Wenn ich mit etwas anfange lade ich meist sogar die Beta :-)

Re: wie füge ich an pos 0 einer Liste etwas ein?

Verfasst: Montag 25. Juni 2007, 14:55
von Zap
Sr4l hat geschrieben:Wenn ich mit etwas anfange lade ich meist sogar die Beta :-)
Ne, das geht ja garnicht, wenn ich bei irgendwas neu einsteige gehe ich immer auf "Nummer Sicher".
Hab keine lust durch einen blöden Zufall auf einen beta-bug zu stoßen. :roll:

Verfasst: Montag 25. Juni 2007, 21:03
von Michael Schneider
Hallo Birkenfeld!

Du hast schon recht, man sollte das angeben, was geht und nicht, was nicht geht. Ich hatte das heute schnell getestet und wurde eben über diese Fehlermeldung fehlgeleitet. Dabei habe ich nicht bedacht, dass es vielleicht in 2.3 schon anders aussieht. Wo genau kann man sich über die Änderungen der einzelnen Releases erkundigen? Auf der Python.org Dokuseite?

An die anderen:
Meine Frage war, ab wann man auf die Version hinweisen sollte. Sowohl nach oben als auch nach unten. Wer legt diesen Grenzwert (Grenzversion) fest? Sollte man sich immer an der neuesten Beta orientieren?
Ich würde mir auch nicht die neueste Beta installieren, sobald sie rauskommt, denn in der Regel möchte ich Python effektiv nutzen und nicht Tester spielen. Das muss ich schon auf der Arbeit. ;-)

Grüße,
Michael

Verfasst: Montag 25. Juni 2007, 21:31
von Sr4l
Fehler haben und zu lösen machen doch erst spaß :-)

http://docs.python.org/whatsnew/whatsnew25.html

Das Whats New ist auch immer in dem Python Document zip mit drin, wie man an alte Whats New Seiten kommt weiß ich jetzt nicht. Auf Pydoc.org konnte ich auf die schnelle nichts finden.

Aber unser Wiki hat folgende schöne Seite: [wiki]Neue Features[/wiki]

Verfasst: Montag 25. Juni 2007, 21:55
von birkenfeld
Alle wichtigen Änderungen sollten jeweils in den "What's New"-Dokumenten beschrieben sein.

Wenn ich weiß, dass etwas neu in 2.5 ist, sage ich das normalerweise auch dazu. 2.4 schon nicht mehr.

Verfasst: Montag 25. Juni 2007, 23:49
von Y0Gi
Um an die älteren "What's New"-Aufstellungen zu kommen, besuche man http://docs.python.org/, klicke auf "Locate previous versions", wähle eine Version aus und finde dort jeweils "What's New in Python X.Y" vor.

Verfasst: Dienstag 26. Juni 2007, 07:36
von mitsuhiko
Michael Schneider hat geschrieben:An die anderen:
Meine Frage war, ab wann man auf die Version hinweisen sollte. Sowohl nach oben als auch nach unten. Wer legt diesen Grenzwert (Grenzversion) fest? Sollte man sich immer an der neuesten Beta orientieren?
Niemand redet von einer Beta. :roll:

CURRENT -> info, dass es neu ist (aktuell 2.5 also)
CURRENT-1 -> einfach annehmen, dass der user dies version hat (aktuell 2.4)