strings vergleichen

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
wildflower
User
Beiträge: 6
Registriert: Montag 1. Juni 2009, 11:06

hallo.

habe folgende frage:
ich möchte 2 strings zeichen für zeichen miteinander vergleichen. bei der ersten abweichung soll mir das zeichen, das abweicht,angezeigt werden. kann mir da jemand vielleicht mit einem lösungsansatz weiterhelfen?

danke
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

2 Stichworte: For-Schleife + `zip` (bzw `itertools.izip`)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Alternativ wäre auch noch das diff-Modul einen Blick wert.
wildflower
User
Beiträge: 6
Registriert: Montag 1. Juni 2009, 11:06

ok, vielen dank für die hilfe. werde mir das mal anschauen :)
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

einfache variante:

Code: Alles auswählen

In [6]: s1 = "Hallo, Welt"

In [7]: s2 = "Hallo, Python"

In [8]: for i, c in enumerate(s1):
   ...:     if c != s2[i]:
   ...:         print "unterschiedliches zeichen: %s an stelle %d" % (c, i)
   ...:
unterschiedliches zeichen: W an stelle 7
unterschiedliches zeichen: e an stelle 8
unterschiedliches zeichen: l an stelle 9
unterschiedliches zeichen: t an stelle 10
verschiedenlange strings bedürfen hier aber noch eines blickes...
http://www.kinderpornos.info
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Mit (i)zip muss man sich aber nicht durch die Indices hangeln ;)
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

hangeln nicht, aber dafür muss ich zweimal indizieren und weiss nicht die position. vor allem setze ich aber lieber die geläufigere funktion ein wenn es eh kein grossen unterschied macht.

Code: Alles auswählen

In [15]: for pair in zip(s1, s2):
   ....:     if pair[0] != pair[1]:
   ....:         print pair
   ....:
('W', 'P')
('e', 'y')
('l', 't')
('t', 'h')
zip ist hier aber überlegen weil ich keine fehler merh produziere wenn die strings unterschiedlich lang sind. aber das müsste man eh behandeln...
http://www.kinderpornos.info
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Naja die Position bekommt man mit einem zwischengeschalteten `enumerate` auch noch:

Code: Alles auswählen

for index, (first, second) in enumerate(izip(s1,s2)):
    if first != second:
        print "Position {0}: {1} <=> {2}".format(index, first, second)
lunar

"enumerate()" funktioniert auch mit dem Rückgabewert von (i)zip, und dank Unpacking kann man sich die Indizierung ganz sparen:

Code: Alles auswählen

for pos, (left, right) in enumerate(zip(s1, s2)):
    if left != right:
        print('Unterschiedliches Zeichen an Position {0}: {1} != {2}'.format(pos, left, right))
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

hübsch...

ich weiss das ja eigentlich, schreibe aber irgendwie doch immer C-code :(
http://www.kinderpornos.info
Antworten