wert in einer Liste suchen

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.
Schildi
User
Beiträge: 30
Registriert: Freitag 19. Mai 2006, 22:23
Kontaktdaten:

wert in einer Liste suchen

Beitragvon Schildi » Dienstag 17. Oktober 2006, 18:30

Hallo allerseits!

habe mal wieder eine kurze Frage :lol:

und zwar: ich möchte einfach einen bestimmten Wert in einer Liste suchen, bzw. erstmal prüfen, ob dieser überhaupt vorhanden ist. Ich hab auch schon einen Ansatz, nur ich bekomm es damit nicht hin, dass auch Worte als Ergebnis angezeigt werden, die nicht direkt alleine stehen. Ein Beispiel dazu:

Code: Alles auswählen

liste = ["guten Tag", "ein schoener Tag", "Tag"]


Wenn ich jetzt mit der index-Funktion nach dem Wort "Tag" suchen würde, würde das Ergebnis logischerweise 2 sein. Ich will aber, dass er sozusagen in jedem der 3 Items fündig wird. Das hat mich direkt an den Info-Unterricht aus der 9. erinnert, denn es gibt z.B. in MySQL so eine Funktion, wo man schreiben muss

...WHERE inhalt = "%tag%"

oder so ähnlich. Kann mir da jemand helfen?

MfG, Schildi
by: Schildi
Crush
User
Beiträge: 44
Registriert: Montag 1. Mai 2006, 11:32

Beitragvon Crush » Dienstag 17. Oktober 2006, 18:37

Hi Schildi

das wäre beispielsweise mit den folgenden Funktionen lösbar:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: UTF-8 -*-

liste = ["guten Tag", "ein schoener Tag", "Tag"]

def test_a():
    for i in liste:
        if "Tag" in i:
            print 'Gefunden:', i

def test_b():
    for i in range(len(liste)):
        if "Tag" in liste[i]:
            print '"Tag" gefunden in item %s' % i

test_a()
test_b()


die Ausgabe wäre hier dann:

Code: Alles auswählen

Gefunden: guten Tag
Gefunden: ein schoener Tag
Gefunden: Tag
"Tag" gefunden in item 0
"Tag" gefunden in item 1
"Tag" gefunden in item 2


aber wie "sauber" das ganze jetzt ist... (aber das können sicher die erfahreneren User noch sagen.)

Gruss Crush
Zuletzt geändert von Crush am Dienstag 17. Oktober 2006, 18:39, insgesamt 1-mal geändert.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 17. Oktober 2006, 18:39

Geht es mit einer LC wie der hier, der deinem SQL Snippet am ehesten entspricht:

Code: Alles auswählen

[wort for wort in liste if "Tag" in wort]


Oder brauchst du die exakten Listenindizes? Dann wäre eher sowas für dich interessant:

Code: Alles auswählen

[liste.index(wort) for wort in liste if "Tag" in wort]
Zuletzt geändert von Leonidas am Dienstag 17. Oktober 2006, 18:40, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Beitragvon Costi » Dienstag 17. Oktober 2006, 18:39

Code: Alles auswählen


liste = ["guten Tag", "ein schoener Tag", "Tag"]
for i in liste:
    if "Tag" in i:
        print "liste enthält", i

#nicht getestet....

#edit
#AHHRGG, leonidas war schneller! ( ;

BlackJack

Beitragvon BlackJack » Dienstag 17. Oktober 2006, 18:59

Leonidas hat geschrieben:Oder brauchst du die exakten Listenindizes? Dann wäre eher sowas für dich interessant:

Code: Alles auswählen

[liste.index(wort) for wort in liste if "Tag" in wort]


Das ist nicht nur "langsam", sondern auch fehlerhaft (Ätsch):

Code: Alles auswählen

In [22]: liste = ['Tag', 'guten Tag', 'ein schoener Tag', 'Tag']

In [23]: [liste.index(wort) for wort in liste if "Tag" in wort]
Out[23]: [0, 1, 2, 0]


Das hier läuft in O(n) Zeit und liefert auch bei mehrfachen vorkommen gleicher Elemente die richtigen Indizes:

Code: Alles auswählen

In [24]: [i for i, wort in enumerate(liste) if "Tag" in wort]
Out[24]: [0, 1, 2, 3]
Schildi
User
Beiträge: 30
Registriert: Freitag 19. Mai 2006, 22:23
Kontaktdaten:

Beitragvon Schildi » Dienstag 17. Oktober 2006, 19:40

wow danke für die schnellen Antworten :wink:

also für meine Zwecke eignet sich das Programm von Costi am besten :) kurz, gut nachzuvollziehen und liefert das, was es soll ;)
nur ich hab gleich schon ein weiteres Problem, bin mir aber sicher, dass ihr mir dabei auch helfen könnt :lol:

Code: Alles auswählen

liste = ["guten Tag", "ein schoener Tag", "Tag", "hallo"]
for i in liste:
    if "hallo" in i:
        print "liste enthält", i
    else:
        print "leider nichts gefunden"
        break

will nicht funktionieren :cry: ich denk ich weiß auch warum, nämlich weil er irgendwie gar nicht bis "hallo" durchläuft, kann das sein? Wie kann man das ändern? Also mein eigentliches Ziel ist es, dass ich nur den Satz "leider nichts gefunden" ausgeben, wenn er halt nichts gefunden hat...wenn ich jetzt

Code: Alles auswählen

if "lala" in i:

eingeben würde, wäre es ja logisch, dass dann dieser Satz ausgegeben wird, aber doch eigentlich nicht bei "hallo"... :shock:

MfG, Schildi
by: Schildi
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Beitragvon murph » Dienstag 17. Oktober 2006, 19:48

du hast genau das geschrieben, was passiert.
jetzt wird jedes element überprüft, ob 'hallo' enthalten ist.
falls das nicht der fall sein sollte, wird die schleife abgebrochen.
weil im ersten element 'hallo' nicht auftaucht, wird der else-abschnitt ausgeführt. der bricht dann die schleife ab.
du willst das wahrscheinlich andersrum,
dann musst du eine variable einführen, die zu beginn einen wert hat (an besten boolean), der sich, falls 'hallo' enthalten sein sollte, verändert.
falls nach dem check/der Schleife die variable immer noch beim anfangszustand ist, kannst du erst deinen satz "i am sorry, but i..." einfügen.
so würdest du das bei jedem einzelnen element, das nicht konform ist,
deine nachricht ausgeben.
die hat nichts in der schleife zu suchen.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 17. Oktober 2006, 19:48

Heute ist mein Use-LCs-for-everything-and-combine-them-with-conditional-expressions-Tag. Der Code geht ab Python 2.5, welches PEP 308 implementiert.

Code: Alles auswählen

In [53]: vorhanden = 'Ja, ist da' if [element for element in liste if 'hallo' in element] else 'Nein, ist nicht da'
In [54]: print vorhanden
Ja, ist da
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Dienstag 17. Oktober 2006, 20:39

Wie ist es damit?

Code: Alles auswählen

liste = ["guten Tag", "ein schoener Tag", "Tag", "hallo"]
suchstring = "Tag"
for i in liste:
    if suchstring in i:
        print "liste enthaelt", suchstring
        break
else:
    print "leider nichts gefunden"
MfG
HWK
BlackJack

Beitragvon BlackJack » Dienstag 17. Oktober 2006, 21:03

Gefällt mir persönlich überhaupt nicht. "else" heisst "sonst", oder "andernfalls", der Zweig wird aber jedesmal ausgeführt wenn die Schleife nicht mit `break` verlassen wird. Intuitiver fände ich wenn der ``else``-Zweig ausgeführt würde, wenn der ``for``-Block gar nicht ausgeführt wurde.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder