Vereinfachung des Codes zum löschen von Objekten in Listen

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.
Sagi
User
Beiträge: 8
Registriert: Dienstag 8. August 2006, 09:47
Wohnort: Benzweiler
Kontaktdaten:

Vereinfachung des Codes zum löschen von Objekten in Listen

Beitragvon Sagi » Dienstag 8. August 2006, 10:25

Hallo!
Ich habe letzte Woche angefangen mir selbst das Programmieren beizubringen und nach vielen Empfehlungen habe ich mir Python ausgesucht. Jetzt baue ich an einem kleinen Programm, dass Listen erstellt und sie in einer Textdatei ausgibt, es sieht wiefolgt aus:

Code: Alles auswählen

#!/usr/bin/python

print 'Hallo, wir erstellen jetzt eine Liste!'

liste = []

dazu = raw_input('Was moechten Sie hinzufuegen? ') # Das erste Objekt der Liste entgegennehmen

liste.append(dazu) # Hinzufuegen des ersten Objekts

print dazu, 'wurde in die Liste aufgenommen!'

nochmal = True

while nochmal: # Schleife, die weitere Objekte entgegen nimmt
   mehr = raw_input('Moechten sie ein weiteres Objekt der Liste hinzufuegen? ')
   if mehr == 'ja':
      wasmehr = raw_input('Und was soll hinzugefuegt werden? ')
      liste.append(wasmehr)
      print wasmehr, 'wurde der Liste hinzugefuegt!'
      print liste
   else:
      nochmal = False
else:
   print 'Die Liste ist jetzt fertig, sie enthaelt', len(liste), 'Objekte!'
   print liste

korrekt = raw_input('Ist die Liste korrekt? ') # Ueberpruefung der Liste mit Aufforderung zur Bestaetigung oder Ablehnung

if korrekt == 'nein':
   
   mehrloeschen = True
   
   while mehrloeschen: # Schleife um Objekte aus der Liste zu entfernen.
      loeschen = raw_input('Welches Objekt moechten sie loeschen? ')
   
      if loeschen == liste[0]:
         del liste[0]
      elif loeschen == liste[1]:
         del liste[1]
      elif loeschen == liste[2]:
         del liste[2]
      elif loeschen == liste[3]:
         del liste[3]
      print loeschen, 'wurde geloescht!'
      print liste

      schleife = raw_input('Moechten sie ein weiteres Objekt entfernen? ')

      if schleife == 'nein':
         mehrloeschen = False
         print 'Gut, jetzt ist die Liste endgueltig fertig! Sie wird als Textdatei gespeichert!'

else:
   print 'Gut, jetzt ist die Liste endgueltig fertig! Sie wird als Textdatei gespeichert!'

resstring = ", ".join(liste) # Umwandlung der Liste in einen String zur Ausgabe in einer Datei

f = file('Liste.txt', 'w') # Ausgabe der Liste in eine Textdatei
f.write(resstring)
f.close()



Genauer geht es mir um folgende Zeilen:

Code: Alles auswählen

   while mehrloeschen: # Schleife um Objekte aus der Liste zu entfernen.
      loeschen = raw_input('Welches Objekt moechten sie loeschen? ')
   
      if loeschen == liste[0]:
         del liste[0]
      elif loeschen == liste[1]:
         del liste[1]
      elif loeschen == liste[2]:
         del liste[2]
      elif loeschen == liste[3]:
         del liste[3]
      print loeschen, 'wurde geloescht!'
      print liste


Das Objekt, dass ich aus der Liste löschen will lässt sich zwar recht einfach durch eine if/elif Anweisung bestimmen, doch muss ich ja so für jedes Objekt eine eigene Anweisung einfügen, und wenn die Liste länger werden soll, gibt das eine ellenlange elif-Liste.
Die Frage ist, ob es dafür einen einfacheren Code gibt. Ich habe schon folgendes ausprobiert:

Code: Alles auswählen

liste = ['Affe', 'Wiesel']

loeschen = raw_input('Welches Objekt moechten sie loeschen?')

for loeschen in liste:
    del liste[loeschen]


Allerding bekomme ich dann folgende Meldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "testi.py", line 6, in ?
    del liste[loeschen]
TypeError: list indices must be integers


Gibt es eine Möglichkeit dieses Problem zu umgehen?

Danke im Vorraus

Sagi
N17R0
User
Beiträge: 53
Registriert: Samstag 6. März 2004, 23:41

Beitragvon N17R0 » Dienstag 8. August 2006, 10:53

Hier ein netter dreizeiler ;) :D

Code: Alles auswählen

>>> liste = ["affe","maus","tieger"]
>>> del liste[liste.index("maus")]
>>> liste
['affe', 'tieger']
Sagi
User
Beiträge: 8
Registriert: Dienstag 8. August 2006, 09:47
Wohnort: Benzweiler
Kontaktdaten:

Beitragvon Sagi » Dienstag 8. August 2006, 12:04

Ha, hat funktioniert :)

Danke :mrgreen:
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Beitragvon N317V » Dienstag 8. August 2006, 14:27

Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Dienstag 8. August 2006, 16:52

N17R0 hat geschrieben:Hier ein netter dreizeiler ;) :D

Code: Alles auswählen

>>> liste = ["affe","maus","tieger"]
>>> del liste[liste.index("maus")]
>>> liste
['affe', 'tieger']


Hier ein netter Einzeiler:

Code: Alles auswählen

liste.remove('maus')
TUFKAB – the user formerly known as blackbird
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Dienstag 8. August 2006, 19:06

Zwei Tipps stellvertretend an alle Pythonanfäger:

1. Frage dich jedesmal, wenn du irgendetwas indiziert ("a[j]"), ob es nicht bequemer geht. Beispiel:

Code: Alles auswählen

# schlecht:
for i in xrange(len(meine_liste)):
  print meine_liste[i] # Moment, hier taucht ein [i] auf!

# besser:
for element in meine_liste:
  print element # AH!
Natürlich benötigt man ab und an das direkte Indizieren, es ist nur gut, vorher nachzudenken, ob es wirklich erforderlich ist, denn:

2. Python ist eine Very-High-Level-Sprache. Sage immer, was du machen willst, nicht wie

In deinem Falle kannst du dich fragen: "Ist es richtig, dass ich das erste Element löschen will, wenn das erste Element == loeschen ist, das Zweite, wenn das Zweite == loeschen ist, das Dritte.... Nein!"

Dann weiter "Will ich aus liste das i-te Element löschen, wobei i die Position des Elementes "maus" in der Liste ist? Nein! Was ich will, ist aus liste das Element "maus" zu löschen."

OK, ist alles etwas holprig formuliert, aber ich denke mal, dass der Grundgedanke klar ist.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder