Seite 1 von 1

Liste und remove!

Verfasst: Donnerstag 30. Juni 2005, 18:49
von Gast88
Wenn ich eine Liste habe:

Liste = [a,b,c,d,e,f,g]

Jetzt möchte ich das b aus der Liste entfernen.
Kann ich das nur mit remove machen, oder gibt es auch einen Befehl, wo man die Stelle eingibt, die gelöscht werden soll?

Vielen Danke!

Re: Liste und remove!

Verfasst: Donnerstag 30. Juni 2005, 18:54
von joe
Hi
Gast88 hat geschrieben: Kann ich das nur mit remove machen, oder gibt es auch einen Befehl, wo man die Stelle eingibt, die gelöscht werden soll?
del(Liste[1]) ginge z.b.

joe

Verfasst: Donnerstag 30. Juni 2005, 18:55
von Leonidas
Wie wärs mit sowas:

Code: Alles auswählen

l = ['a','b','c','d','e','f','g']
l.pop(1)
Das löscht die zweite Position aus der Liste.

Re: Liste und remove!

Verfasst: Donnerstag 30. Juni 2005, 21:53
von BlackJack
joe hat geschrieben:del(Liste[1]) ginge z.b.
Ich würde die Klammern weglassen. So sieht das verdammt nach einem Funktionsaufruf aus -- ``del`` ist aber eine Anweisung.

Die `pop()` Methode gefällt mir noch besser.

Verfasst: Montag 4. Juli 2005, 16:10
von enodev
dazu fällt mir die frage ein, wie man am effektivsten einen string aus einer liste von strings löscht, auch wenn das vielleicht etwas von der ursprünglichen fragestellung abweicht.

meine herangehensweise war immer etwa:

Code: Alles auswählen

#einige beispiel-variablen
string_liste = ['a','b','c','d']
loesch_string = 'b'

#meine art einen string aus einer liste zu löschen
string_liste = [string for string in string_liste[:] if string is not loesch_string]
im grunde genommen kann man das bei jeder liste (unabhängig vom inhalt der liste) so machen.
mein grund für diese herangehensweise ist das fehlen von indizes, mit denen man direkt auf die elemente zugreifen könnte, die aber das leben manchmal sehr verkomplizieren können.

gibt es eine andere/bessere methode ein listen-element zu löschen, dessen index man nicht kennt?

schönen tag noch,
enodev

p.s.: mein erster post! tolles forum!

Edit (Leonidas): Code in Python-Tags gesetzt.

Verfasst: Montag 4. Juli 2005, 16:13
von mawe
Hi!

Warum nicht mit remove?

Code: Alles auswählen

string_liste.remove("b")
Gruß, mawe

Verfasst: Montag 4. Juli 2005, 16:33
von enodev
:shock: ha!

ich war immer der meinung remove verlangt auch nen index :oops:
dann habich noch die ausrede python seit knapp 2 monaten überhaupt erst zu kennen.
und außerdem sieht das skript so viel wissenschaftlicher aus! :D

danke schön für's aufklären!

Verfasst: Montag 4. Juli 2005, 23:11
von BlackJack
[quote="enodev"]

Code: Alles auswählen

#meine art einen string aus einer liste zu löschen
string_liste = [string for string in string_liste[:] if string is not loesch_string]
Mit ``string_liste[:]`` erzeugst Du eine Kopie der Liste. Das ist aber völlig unnötig weil Du die originale Liste gar nicht veränderst. Ein echter Fehler ist das ``is not``, das testet ob es sich nicht um das gleiche Objekt handelt und nicht, ob die beiden Zeichenketten den gleichen Inhalt haben. Beispiel:

Code: Alles auswählen

In [59]: a = "abc"

In [60]: b = "abc"

In [61]: a is b
Out[61]: True

In [62]: a = "2. Versuch"

In [63]: b = "2. Versuch"

In [64]: a is b
Out[64]: False

In [65]: a == b
Out[65]: True
Eine korrekte Version wäre also:

Code: Alles auswählen

def remove_all(seq, unwanted):
    return [element for element in seq if element != unwanted]
Die Funktion hat auch einen anderen Effekt als `list.remove()` wenn das ungewünschte Element öfter vorkommt. Die Funktion da oben entfernt alle vorkommen während `list.remove()` nur den ersten Treffer aus der Liste entfernt.

Verfasst: Dienstag 5. Juli 2005, 06:31
von jens
Hm! Dein Beispiel verstehe ich aber nicht, bei mir gibt's immer ein True:

Code: Alles auswählen

a = "abc"
b = "abc"

print a is b

a = "2. Versuch"
b = "2. Versuch"

print a is b

print a == b

Verfasst: Dienstag 5. Juli 2005, 10:17
von joe
jens hat geschrieben:Hm! Dein Beispiel verstehe ich aber nicht, bei mir gibt's immer
Die referenzvergabe bei unveränderlichen typen ist undefiniert und ist z.B. im interaktiven modus einseits und in scripten andererseits unterschiedlich.
joe

Verfasst: Dienstag 5. Juli 2005, 10:22
von querdenker
schöne Stolperfalle, wenn man interaktiv Code testet um ihn dann später ins Script zu übernehmen.

Gibt es da noch mehr Ecken?

Jetzt verstehe ich ein paar Ungereimtheiten, über die ich bisher gestolpert bin.


mfg, querdenker

Verfasst: Dienstag 5. Juli 2005, 10:42
von jens
querdenker hat geschrieben:schöne Stolperfalle, wenn man interaktiv Code testet um ihn dann später ins Script zu übernehmen.
Naja, ich benutze den interaktive Modus eh nie... Ich hab dazu meine test.py die ich mit SciTE editiere und direkt per F5 ausführe... Ist fast wie ein interaktiver Modus ;)

Verfasst: Dienstag 5. Juli 2005, 11:00
von joe
querdenker hat geschrieben:schöne Stolperfalle, wenn man interaktiv Code testet um ihn dann später ins Script zu übernehmen.
Naja, is auf unveränderliche typen anzuwenden ist nunmal nicht sonderlich sinnvoll und ist eher ein zeichen von mangelhaften pythonkenntnissen. Sicherlich gibt es auch noch andere befehle, die, falsch angewandt, undefinierte ergebnisse erzeugen.
joe

Verfasst: Dienstag 5. Juli 2005, 21:09
von BlackJack
jens hat geschrieben:Hm! Dein Beispiel verstehe ich aber nicht, bei mir gibt's immer ein True:

Code: Alles auswählen

a = "abc"
b = "abc"

print a is b

a = "2. Versuch"
b = "2. Versuch"

print a is b

print a == b
Das liegt daran, das im interaktiven Modus jede eingegebene Zeile einzeln übersetzt wird und im Skript alles auf einmal und da Zeichenketten mit gleichem Inhalt als ein Objekt übersetzt werden. Aber versuch's mal damit:

Code: Alles auswählen

a = '3. Versuch'
b = '3. Ver' + 'such'
print a is b
print a == b

Verfasst: Mittwoch 6. Juli 2005, 06:37
von jens
BlackJack hat geschrieben:Aber versuch's mal damit:
Hast recht dann gibt's mit einem "is" ein False...