Durchsuchen von Strings

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
TimoSan
User
Beiträge: 3
Registriert: Freitag 3. November 2006, 14:44

Hallo,

ich arbeite erst sehr kurz mit Python und ich habe ein kleines Problem mit dem Projekt, an dem ich arbeite: Ich versuche, aus einer Liste von Strings diejenigen Strings herauszufinden, in denen alle Elemente einer zweiten Liste vorkommen.

Um das mal etwas verständlicher auszudrücken:

Ich habe eine Liste, die vom Prinzip her so aussehen könnte:

x = ['abcdefghi','hsdsjdwhwd','abcdefghi','adwjdeme']

Nun wäre es ja kein großes Problem, diese Liste zum Beispiel nach dem Buchstaben b zu durchsuchen oder zu sagen:

Code: Alles auswählen

for i in range(0,anzahl_elemente-1):
     if "b" in x[i]
          print x[i]
Damit bekäme man dann alle Elemente der Liste x ausgegeben, in denen der Buchstabe "b" vorkommt. Etwas in der Art benötige ich auch, nur mit dem Unterschied:

Ich habe noch eine zweite Liste, sagen wir

y = ['hsd','j','whwd']

Und jetzt möchte ich herausfinden: in welchem Element von x kommen *alle* Elemente von y vor? Das heißt, dass ich als Ausgabe nur das zweite Element von x bekommen möchte.

ich könnte da natürlich eine kleine Verschachtelung machen, à la

Code: Alles auswählen

for i in range(0,anzahl_elemente_x-1):
      if y[0] and y[1] and y[2] in x[i]:
           print x[i]
Das ist im Prinzip das, was ich brauche. Aber die Anzahl der Elemente in y muss variabel sein. Darum kann ich nicht einfach zwei 'and' mit einbauen.

Bisher habe ich leider keinen Befehl gefunden, der folgendes für mich tut:

Durchsuche Liste x und gib jene Elemente aus, die *alle* Elemente einer Liste y enthalten.

Weiß jemand von Euch da einen existierenden Befehl oder kann mir mit einem anderen Kniff weiterhelfen?

Ich würde mich über einen Tipp sehr freuen.

Grüße
T
r2d2
User
Beiträge: 43
Registriert: Donnerstag 2. März 2006, 23:05
Wohnort: Bielefeld

Code: Alles auswählen

x = ['abcdefghi','hsdsjdwhwd','abcdefghi','adwjdeme'] 
y = ['hsd','j','whwd']

# ex ist ein element aus x
# ey element aus y

for ex in x:
    z = 0 # zaehler fuer treffer
    for ey in y:
        if ey in ex: z = z + 1

    # wenn anzahl der treffer gleich mit der 
    # anzahl der elemente in y, dann sind alle elemente enthalten

    if z == len(y): print ex
willkommen im forum.
äh, nimm diese schlange von meinem hals.
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

1.Würde ich das ganze in eine Funktion packen

2.

Code: Alles auswählen

if ey in ex:
    z=z+1

und nicht

Code: Alles auswählen

if ey in ex: z = z + 1

Das gleiche mit

Code: Alles auswählen

if z == len(y): print ex
Das ist unschön.
mfg

Thomas :-)
BlackJack

TimoSan hat geschrieben:

Code: Alles auswählen

for i in range(0,anzahl_elemente-1):
     if "b" in x[i]
          print x[i]
In Python kann man direkt über viele Container-Objekte iterieren und muss keinen Index benutzen. Das Beispiel sieht "pythonisch" so aus:

Code: Alles auswählen

for item in x:
     if 'b' in item:
          print item
Damit bekäme man dann alle Elemente der Liste x ausgegeben, in denen der Buchstabe "b" vorkommt. Etwas in der Art benötige ich auch, nur mit dem Unterschied:

Ich habe noch eine zweite Liste, sagen wir

y = ['hsd','j','whwd']

Und jetzt möchte ich herausfinden: in welchem Element von x kommen *alle* Elemente von y vor? Das heißt, dass ich als Ausgabe nur das zweite Element von x bekommen möchte.

ich könnte da natürlich eine kleine Verschachtelung machen, à la

Code: Alles auswählen

for i in range(0,anzahl_elemente_x-1):
      if y[0] and y[1] and y[2] in x[i]:
           print x[i]
Achtung: Das würde nicht funktionieren! Das liest sich als englischer Satz recht nett, aber ``and`` ist ein (mehr oder weniger) mathematisch definierter Operator. In der Bedingung wird erst ``y[0] and y[1] and y[2]`` zu einem Wert ausgewertet und dieser eine Wert wird dann in ``x`` gesucht. Nicht ganz das was Du haben wolltest.

Schreib Dir doch einfach eine kleine Funktion die das gewünschte tut (ungetestet):

Code: Alles auswählen

def search(needles, haystacks):
    result = list()
    for haystack in haystacks:
        for needle in needles:
            if needle not in haystack:
                break
        else:
            result.append(haystack)
    return result
Edit: Funktion vereinfacht
TimoSan
User
Beiträge: 3
Registriert: Freitag 3. November 2006, 14:44

Vielen Dank für die vielen guten Tipps.
Ich hab mir jetzt wie geraten ne kleine Funktion geschrieben, die auch auf Anhieb funktioniert hat. Alles super, also, danke.
Antworten