Schleifenproblem

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
breathe_easy
User
Beiträge: 58
Registriert: Sonntag 29. Juli 2007, 18:34

Hallo,
ich möchte zwei Strings miteinander vergleichen, so daß geschaut wird ob der index 0 des ersten Strings im zweiten irgendwo vorkommt und dann der index 1 usw. Ich habe das mit folgenden Schleifen versucht aber die Schleife mit j läuft nicht komplett mit index 0 von eingabe durch woran liegt das? Ich hoffe das Ganze ist verständlich formuliert. Ist die Einrückung falsch?

Code: Alles auswählen

for i in range (0,len(eingabe)):
        a = eingabe[i]
        print a
        for j in range (0, len(zu_raten)):
            b = zu_raten[j]
            print b
            if a == b:
                print a, " ist enthalten"
                if i == j:
                    print "und an der richtigen Stelle"
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Code: Alles auswählen

>>> a="Hallo Welt"
>>> b="Ein langer Satz in dem sicherlich viele Buchstaben gleich sind"
>>> for i in a:
...     if i in b:
...             print True, i
...
True a
True l
True l
True
True e
True l
True t
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Warum so kompliziert?

Code: Alles auswählen

foo = 'Foobar'
bar = 'bar'

for count, c in enumerate(bar):
    if c in foo:
        print "Juchei! %s ist in %s enthalten!" %(c, foo)
        if count == foo.index(c):
            print "Wow! Und auch an der gleichen Stelle wie in %s" % foo

breathe_easy
User
Beiträge: 58
Registriert: Sonntag 29. Juli 2007, 18:34

o.k. das sieht natürlich alles viel eleganter aus. Trotzdem wäre ich dankbar, wenn mir jemand sagen würde warum meine Version nicht so durchläuft wie geplant. Mit anderen Worten was muss ich tun, um den Programmfluß zu verändern, damit die innere Schleife zuerst durchläuft und erst dann die Äußere weitergeführt wird. Mit anderen Worten ich habe ein Grundsatzproblem. Trotzdem vielen Dank für eure Mühe und schnelle Antwort.
Zuletzt geändert von breathe_easy am Donnerstag 6. März 2008, 20:11, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Das mit der gleichen Stelle hat er ja nicht erwähnt ... aber du hast da imho nen Fehler drin:

Code: Alles auswählen

        if count == bar.index(c):
Sonst macht es gar keinen Sinn!

Davon abgesehen teste das mal, wenn du statt bar="bar" mal bar="barbar" nimmst!

Also imho besser so:

Code: Alles auswählen

for count, c in enumerate(bar):
     if c in foo:
         print "Juchei! %s ist in %s enthalten!" %(c, foo)
         if c == bar[count]:
             print "Wow! Und auch an der gleichen Stelle wie in %s" % foo
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@breathe_easy: Dein Script läuft doch durch! Oder aber ich sehe das Problem nicht!

Das einzige was passieren kann ist doch, dass es mehr als eine Übereinstimmung geben kann (eben weil du den 2. String ja immer komplett durchgehst!) Da müßteste dann nen break einbauen nach einem Treffer - wenn Du diesen Code wirklich so behalten willst ;-)

Ansonsten läuft das bei mir korrekt durch.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

breathe_easy hat geschrieben:o.k. das sieht natürlich alles viel eleganter aus. Trotzdem wäre ich dankbar, wenn mir jemand sagen würde warum meine Version nicht so durchläuft wie geplant. Mit anderen Worten was muss ich tun, um den Programmfluß zu verändern, damit die innere Schleife zuerst durchläuft und erst dann die Äußere weitergeführt wird. Mit anderen Worten ich habe ein Grundsatzproblem.
Ich glaube, sogar mehr als eins ...

Wie Hyperion schon angemerkt hat, dein Programm sollte das machen, was du möchtest. An dem Programmausschnitt, den du uns zeigst, kann es nicht liegen. Gib dochmal konkret die Zeichenketten an, mit denen du es laufen lässt und meinst, dass es nicht funktioniert.

In jedem Fall wäre es nicht verkehrt, wenn du dir die von Hyperion vorgeschlagene Lösung nochmal ansehen würdest. Die sieht nicht nur "viel eleganter" aus, sie ist auch nicht besonders kompliziert. Und den Aspekt mit "an der richtigen Stelle" - falls das wichtig ist - könntest du z.B. über die String-Methode index() ergänzen.

Und wenn du - warum auch immer - bei deiner Struktur bleiben willst, dann solltest du zumindest etwas an der Ausgabe arbeiten. So bekommt man alles untereinander und es ist sehr unübersichtlich. Und: Bei range(a,b) brauchst du a nicht, wenn a=0 ist.
breathe_easy
User
Beiträge: 58
Registriert: Sonntag 29. Juli 2007, 18:34

Hey danke für euren Support! Ich habe gestern einen Fehler beim Check gemacht und gedacht es sei etwas falsch aber die Schleifen laufen natürlich durch. Gerne werde ich die von Hyperion vorgeschlagene Lösung annehmen!
Sie ist toll. Als Anfänger ist es manchmal schwierig aus den eigenen Denkstrukturen auszubrechen und sich in die Anderer hinein zu versetzen.
Antworten