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

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

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:

Ha, hat funktioniert :)

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

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

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

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
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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