Seite 1 von 1

wert in einer Liste suchen

Verfasst: Dienstag 17. Oktober 2006, 18:30
von Schildi
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

Verfasst: Dienstag 17. Oktober 2006, 18:37
von Crush
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

Verfasst: Dienstag 17. Oktober 2006, 18:39
von Leonidas
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]

Verfasst: Dienstag 17. Oktober 2006, 18:39
von Costi

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! ( ;


Verfasst: Dienstag 17. Oktober 2006, 18:59
von BlackJack
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]

Verfasst: Dienstag 17. Oktober 2006, 19:40
von Schildi
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

Verfasst: Dienstag 17. Oktober 2006, 19:48
von murph
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.

Verfasst: Dienstag 17. Oktober 2006, 19:48
von Leonidas
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

Verfasst: Dienstag 17. Oktober 2006, 20:39
von HWK
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

Verfasst: Dienstag 17. Oktober 2006, 21:03
von BlackJack
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.

Re:

Verfasst: Montag 11. Mai 2020, 12:04
von has
Lässt sich dies auch über while lösen? Insbesondere suche ich nach dem 1. Buchstaben in einem Listenelement, was in der for if Schleiße durch "if "D" in i[0]:" lösen ließe, aber ich bekomme es nicht für while hin.

Danke!
Schildi hat geschrieben: 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