Liste und remove!

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
Gast88

Donnerstag 30. Juni 2005, 18:49

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!
joe

Donnerstag 30. Juni 2005, 18:54

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
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 30. Juni 2005, 18:55

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Donnerstag 30. Juni 2005, 21:53

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.
enodev
User
Beiträge: 2
Registriert: Montag 4. Juli 2005, 15:38

Montag 4. Juli 2005, 16:10

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.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Montag 4. Juli 2005, 16:13

Hi!

Warum nicht mit remove?

Code: Alles auswählen

string_liste.remove("b")
Gruß, mawe
enodev
User
Beiträge: 2
Registriert: Montag 4. Juli 2005, 15:38

Montag 4. Juli 2005, 16:33

: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!
BlackJack

Montag 4. Juli 2005, 23:11

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

Dienstag 5. Juli 2005, 06:31

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
joe

Dienstag 5. Juli 2005, 10:17

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
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Dienstag 5. Juli 2005, 10:22

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

Dienstag 5. Juli 2005, 10:42

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 ;)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
joe

Dienstag 5. Juli 2005, 11:00

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
BlackJack

Dienstag 5. Juli 2005, 21:09

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

Mittwoch 6. Juli 2005, 06:37

BlackJack hat geschrieben:Aber versuch's mal damit:
Hast recht dann gibt's mit einem "is" ein False...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten