Seite 1 von 1

Durchsuchen von Strings

Verfasst: Montag 27. November 2006, 22:35
von TimoSan
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

Verfasst: Montag 27. November 2006, 22:52
von r2d2

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.

Verfasst: Montag 27. November 2006, 23:00
von Python 47
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.

Re: Durchsuchen von Strings

Verfasst: Montag 27. November 2006, 23:07
von 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

Verfasst: Dienstag 28. November 2006, 18:48
von TimoSan
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.