Seite 1 von 1
Test mit Teilstring
Verfasst: Mittwoch 24. März 2004, 09:02
von wuf
Hallo Python Freunde
In Python ist doch folgende Test-Anweisung möglich:
if item
in liste:
Ein Test-Beispiel:
Code: Alles auswählen
liste = ['EB1','AW54','ED11']
if 'ED11' in liste:
print 'TRUE'
else:
print 'FALSE'
Ist es möglich mit dieser Test-Anweisung, einen Test
mit einem Teilstring durchzuführen. Das heisst ich
möchte z.B. testen ob sich der Teilstring 'AW' in
der Liste befindet.
Mein Beispiel welches natürlich nicht funktionieren
kann ist folgendes:
Besten Dank für Eure Hilfe
Gruss Fritz
Verfasst: Mittwoch 24. März 2004, 09:37
von fs111
Ähm warum probierst Du es nicht einfach aus. In Python gibt es doch die tolle Möglichkeit interaktiv im Interpreter zu schreiben, anstatt hie auf eine Antwort zu warten, hättest Du es in 30 Sekunden selbt herausgefunden.
Grüße fs111
P.S Ja, das geht, wieso auch nicht?
Verfasst: Mittwoch 24. März 2004, 13:10
von Dookie
Hi wuf,
@fs111:
ich glaube du hast wufs Frage falsch verstanden. Gehen tuts, nur kommt nicht das von wuf gewünschte Ergebnis raus.
Aber mit einem kleinen schmutzigen

Trick gehts.
Code: Alles auswählen
liste = ['EB1','AW54','ED11']
if "AW" in "".join(liste):
print "TRUE"
else:
print "FALSE"
# oder gleich
# print "AW" in "".join(liste)
Gruß
Dookie
Verfasst: Mittwoch 24. März 2004, 13:13
von Milan
Hi. Das mit dem ausprobieren stimmt, dein ps aber nicht (Hier steht alles über
Sequenzen.

Man muss jedes einzelne item prüfen:
Code: Alles auswählen
for i in liste:
if i.find("AW")!=1:
print "True"
break
else:
print "False"
oder wenn du gleich die items haben willst:
Code: Alles auswählen
subs=[i for i in liste if i.find("AW")!=-1]
print len(sub)!=0
Milan
Verfasst: Mittwoch 24. März 2004, 13:52
von wuf
Hallo fs111 hier meine verspätete Antwort
Danke für Deine Anregung, aber Du hast vielleicht
meine Frage nicht richtig verstanden.
Ich möchte, dass in meinem letzten Beispiel mit dem
print-Befehl ein 'TRUE' zurückgegeben wird. Die Input-
Liste ist die zuoberst erwähnte Liste. Ich suche nach
dem Teilstring 'AW'. In der Liste ist dieser Teilstring
im zweiten Element mit 'AW54' enthalten. Das heisst für
meinen Test sollten nur die ersten zwei Zeichen eines
Strings in der Liste relevant sein. Und als Resultat
erwarte ich beim folgenden Code ein 'TRUE'
(Ich meinte mit "welches natürlich nicht funktionieren kann",
dass ich dem folgenden ein 'FALSE' zurückbekommen werde.
Das stellte ich unter Idle auch in 30 Sekunden fest.)
Hier nochmals mein Beispiel:
Code: Alles auswählen
liste = ['EB1','AW54','ED11']
if 'AW' in liste:
print 'TRUE'
else:
print 'FALSE'
Meine verkürzte Lösung mit einer Iteration,
die mir nicht gefällt:
OK fs111
Gruss wuf
P.S. Hallo Milan und Dookie untersuche gerade
Eure Vorschläge.
Danke
Verfasst: Mittwoch 24. März 2004, 15:16
von wuf
Hi Dookie, Milan und fs111
Habe Eure guten Vorschläge ausprobiert
Dookies Lösung kommt meiner Vorstellung am nächsten, weil sie
mit der if-Anweisung auskommt und nur die kleine Erweiterung
"".join benötigt, um den Test auch mit Teilstrings durchführen
zu können. Sicher wird im Hintergrund auch bei der join-Methode
irgendwie eine Iteration ablaufen müssen.
Dookies Zitat: ein kleiner schmutziger Trick machts möglich,
erinnert mich an die kürzlich bei uns gezeigte MusikStar-TV-
Sendung. Da schlug ein Juror den Starkandidaten vor, ihre Songs
müssen unbedingt mehr Dreck drin haben damit sie ankommen.
Also auch bei Python wirkt ein bisschen Schmutz im Code Wunder. Hi
Milan auch Deine beiden Lösung mit der Methode find() für den eigentlichen
Teilstringtest ist sehr interessant. Ich wollte bei meinem Beispiel
einfach von der offizielle Iterations-Anweisung wegkommen. Aber es ist
immer gut mehrere Lösungsansätze zu sehen. Je nach Anwendung hat das
eine oder das andere Vorteile. In Bücher sucht man fast bis zum geht
nicht mehr nach solchen nützlichen Anregungen.
fs111 wie auch Deine Forum-Kollegen feststellten konnten hast Du meine
Frage missverstanden.
OK! Auf jedenfall vielen Dank für Eure nützlichen Tipps.
Die besten Grüsse

Verfasst: Mittwoch 24. März 2004, 15:22
von Dookie
Hi wuf,
tja. das mit den ersten beiden Zeichen hättest Du gleich sagen sollen, mein Beispiel und das von Milan finden auch z.B. "54" da 54 ja ein Teilstring von 'AW54' ist.
Code: Alles auswählen
if [x for x in liste if x.startswith("AW")]:
print "TRUE"
else:
print "FALSE"
Gruß
Dookie
Verfasst: Mittwoch 24. März 2004, 16:38
von wuf
Hi Dookie
Hast Du noch mehr von diesen fantastischen Lösungen.
Das ist wirklich gute Kost. Ehrlich gesagt beim lesen
Deiner letzten Lösung stottere ich noch wenig. Da ich
mit dem verschachteln von Anweisungen noch meine Mühe
habe. Danke für das neues Wort 'startswith()'. Wird
natürlich sofort in meine Methoden-Sammlung aufgenommen.
Warum braucht es z.B. die eckigen Klammern. Warum braucht
es zwischen den beiden Anweisungen for und if in den eckigen
Klammern nicht spezielle Trennzeichen oder sogar Klammern.
Ist ja gut da jedes Sonderzeichen eines zuviel ist.
Wie sind die Regeln beim verschachteln von Anweisugen.
Eventuell kannst Du mir ein Tipp geben, wo ich über Ver-
schachtelung von Anweisungen noch mehr erfahren kann.
Ich habe Bücher vor mir in denen scheinen Wörter wie
'Verschachtelung' Fremdwörter zu sein. Über OOP wird
zwar sehr viel erwähnt.
Sorry: Natürlich gefällt mir Eure Lösung für die Suche nach
einem Teilstring, egal an welcher Position in der Liste,
oder in welchem Listenelement sich dieser befindet am besten.
Bei meiner jetztigen Anwendung sind nur die ersten zwei Zeichen
relevant (Habe ich leider nicht explizit erwähnt). Es
gibt aber in der Zukunft sicher noch weitere Anwendungen bei
denen es anderst verlangt wird.
OK Dookie! Besten Dank für Deine Hilfe
Gruss wuf

Verfasst: Mittwoch 24. März 2004, 17:22
von Dookie
Hi wuf,
tja, elegante Lösungen finden war schon immer ein Hobby von mir
Das was Du als "verschachtelte Anweisungen" bezeichnest nennt sich
List Comprehensions. Genauso schwierig wie der Name sind sie auch zu erklähren, aber ich versuchs mal.
Du kennst ja die eingebauten Funktionen map und filter, mit denen man Listen mit hilfe von Funktionen bearbeiten kann um neue Listen zu erhalten.
Mein Beispiel kann man auch mit filter() und lambda nachbilden.
Code: Alles auswählen
if filter(lambda x : x.startswith("AW"), liste):
print "TRUE"
else:
print "FALSE"
In beiden Fällen lasse ich aus liste eine Liste erzeugen, mit allen Elementen, die mit "AW" anfangen. Dazu sollte ich noch anmerken, daß bei logischen Abfragen (wie if) jede nichtleere Liste als True behandelt wird und eine leere Liste als False.
List Comprehensions sind eine relativ neue Möglichkeit in Python um ebendies zu erreichen.
ergibt das gleiche wie
ohne funktionale Programmierung (mit filter, und lambda) müsste man das Ganze so schreiben:
Code: Alles auswählen
found = []
for x in liste:
if x.startswith("AW"):
found.append(x)
oder in einer Zeile (Achtung funktioniert so nicht dient nur zur Veranschaulichung!):
Code: Alles auswählen
found = []; for x in liste: if x.startswith("AW"): found.append(x)
Was dem Code mit List Comprehensions schon sehr änlich sieht. Man Spart sich aber bei LC die zusätzliche Variable "found" und das "found.append(x)" am Ende.
Wenn man das weiß, sind List Comprehensions oft leichter zu lesen als filter- map-Kombinationen und man kann auch ohne Umwege mit lambda beliebige Funktionen mit beliebigen Parametern und auch Methoden der Items für das Erzeugen der Liste verwenden. Ein weiterer Pluspunkt für LCs, sie sind meist schneller als filter und map.
Gruß
Dookie
Verfasst: Mittwoch 24. März 2004, 18:38
von fs111
OK, jezt habe ich es auch verstanden.
Grüße fs111
Verfasst: Mittwoch 24. März 2004, 19:00
von Dookie
Hallo,
noch ein Tipp, nicht nur für Pythonneulinge.
pydoc str
pydoc print
pydoc list
...
in der Konsole (nicht Pythonkonsole!) bzw. im Dosfenster eingeben.
Spart oft einen Blick in die Handbücher oder die Onlinedocu.
Ich hab beim Programmieren in Python neben gvim immer ein Consolefenster und ein Fenster in dem die Pythonconsole läuft offen.
Gruß
Dookie
Verfasst: Mittwoch 24. März 2004, 19:53
von Milan
Hi. In der Pythoncolsole geht das auch... du musst nur help(list) schreiben...
Milan
Verfasst: Mittwoch 24. März 2004, 20:10
von Dookie
Hi Milan,
stimmt, aber da ich dann gerne das gefundene gleich ausprobiere, sind mir 2 Fenster lieber. Ausserdem gibts ja auch noch pydoc -g.
Gruß
Dookie
Verfasst: Mittwoch 24. März 2004, 21:02
von wuf
Hi Dookie
Besten Dank für Deine didaktisch überzeugende Einführung in
die Welt von Comprehensions und mit dem gezielten Verweis
auf weitere Infos im Python-Tutorial. Ist ein guter kick off um
tiefer in diese Materie einzutauchen. Glaub mir ich bin absolut
nicht zu faul in den vielen zur Verfügung Docs nachzuschauen. Das
nachschauen wird dadurch erschwert, dass man selber nicht einmal
die richtige Bezeichnung für sein Problem kennt.
Viele Neuigkeiten werden mir von Euch vorgestellt. Den Befehl pydoc,
welcher auf der Terminal-Konsole eingegeben werden kann, kannte
ich bis jetzt gar nicht und war überrascht wie schnell man auf
diese Art zu Informationen kommt.
OK Dookie, Milan und fs111 nochmals ein Dankeschön für Euren Support.
Grüsse wuf

Verfasst: Donnerstag 25. März 2004, 14:03
von Dookie
Hallo nochmal.
sorry, aber mein erstes Beispiel mit dem
"AW" in "".join(liste) ist buggy, es findet auch in dem Beispiel "1A" und "4E". Also auch beim suchen nach Teilstrings irgendwo im Wort am besten mit List Comperhensions arbeiten.
Gruß
Dookie *derauchnureinmenschistundfehlermacht*
Verfasst: Donnerstag 25. März 2004, 14:34
von wuf
Hallo Dookie
Alles klar.
Danke noch für Dein Hinweis.
Gruss wuf
