Test mit Teilstring

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.
Benutzeravatar
wuf
User
Beiträge: 1410
Registriert: Sonntag 8. Juni 2003, 09:50

Test mit Teilstring

Beitragvon wuf » Mittwoch 24. März 2004, 09:02

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:

Code: Alles auswählen

if 'AW' in liste:
   print 'TRUE'
else:
   print 'FALSE'


Besten Dank für Eure Hilfe

Gruss Fritz :wink:
Benutzeravatar
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

Beitragvon fs111 » Mittwoch 24. März 2004, 09:37

Ä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?
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Mittwoch 24. März 2004, 13:10

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Mittwoch 24. März 2004, 13:13

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
Benutzeravatar
wuf
User
Beiträge: 1410
Registriert: Sonntag 8. Juni 2003, 09:50

Beitragvon wuf » Mittwoch 24. März 2004, 13:52

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:

Code: Alles auswählen

for item in liste:
   if item[:2] == 'AW':
      print 'TRUE'

OK fs111
Gruss wuf :wink:

P.S. Hallo Milan und Dookie untersuche gerade
Eure Vorschläge.
Danke
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1410
Registriert: Sonntag 8. Juni 2003, 09:50

Beitragvon wuf » Mittwoch 24. März 2004, 15:16

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 :P

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 :wink: :wink: :wink:
Take it easy Mates!
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Mittwoch 24. März 2004, 15:22

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
Benutzeravatar
wuf
User
Beiträge: 1410
Registriert: Sonntag 8. Juni 2003, 09:50

Beitragvon wuf » Mittwoch 24. März 2004, 16:38

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 :wink:
Take it easy Mates!
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Mittwoch 24. März 2004, 17:22

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.

Code: Alles auswählen

found = [x for x in liste if x.startswith("AW")]

ergibt das gleiche wie

Code: Alles auswählen

found = filter(lambda x : x.startswith("AW"), liste)

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
Benutzeravatar
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

Beitragvon fs111 » Mittwoch 24. März 2004, 18:38

OK, jezt habe ich es auch verstanden.

Grüße fs111
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Mittwoch 24. März 2004, 19:00

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Mittwoch 24. März 2004, 19:53

Hi. In der Pythoncolsole geht das auch... du musst nur help(list) schreiben...

Milan
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Mittwoch 24. März 2004, 20:10

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
Benutzeravatar
wuf
User
Beiträge: 1410
Registriert: Sonntag 8. Juni 2003, 09:50

Beitragvon wuf » Mittwoch 24. März 2004, 21:02

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 :wink:
Take it easy Mates!
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 25. März 2004, 14:03

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.

Code: Alles auswählen

[x for x in liste if "AW" in x]



Gruß

Dookie *derauchnureinmenschistundfehlermacht*

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder