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

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

Beitragvon jo_hb » Sonntag 24. Juni 2007, 18:28

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:

Beitragvon Pyre » Sonntag 24. Juni 2007, 18:45

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

Beitragvon jo_hb » Sonntag 24. Juni 2007, 18:52

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

Beitragvon mitsuhiko » Sonntag 24. Juni 2007, 23:23

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 25. Juni 2007, 07:18

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Michael Schneider
User
Beiträge: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

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

Beitragvon Michael Schneider » Montag 25. Juni 2007, 10:52

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

Beitragvon mitsuhiko » Montag 25. Juni 2007, 10:53

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

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

Beitragvon birkenfeld » Montag 25. Juni 2007, 11:09

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: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

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

Beitragvon Michael Schneider » Montag 25. Juni 2007, 12:01

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

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

Beitragvon birkenfeld » Montag 25. Juni 2007, 12:07

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: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

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

Beitragvon Michael Schneider » Montag 25. Juni 2007, 12:28

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

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

Beitragvon birkenfeld » Montag 25. Juni 2007, 14:29

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:

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

Beitragvon Sr4l » Montag 25. Juni 2007, 14:38

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

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

Beitragvon Zap » Montag 25. Juni 2007, 14:55

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: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Montag 25. Juni 2007, 21:03

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder