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

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
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

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...)
Pyre
User
Beiträge: 3
Registriert: Donnerstag 1. Februar 2007, 20:35
Kontaktdaten:

mit insert:

Code: Alles auswählen

>>> a = [2, 4, 6, 8]
>>> a.insert(0, 17)
>>> a
[17, 2, 4, 6, 8]
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Ah, prima, vielen Dank! :)
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Und wenn man mehrere Elemente vorne einfügen will am besten einmal reverse machen, dann ein paar mal appenden und dann wieder reverse.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Da ist die Frage was schneller ist, die reverse-append-reverse Geschichte oder mehrere inserts...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Zuletzt geändert von Michael Schneider am Montag 25. Juni 2007, 10:54, insgesamt 1-mal geändert.
Diese Nachricht zersört sich in 5 Sekunden selbst ...
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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 ;)
TUFKAB – the user formerly known as blackbird
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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?
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

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 :-)
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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:
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

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]
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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)
TUFKAB – the user formerly known as blackbird
Antworten