Seite 1 von 1
strings vergleichen
Verfasst: Montag 1. Juni 2009, 12:06
von wildflower
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
Verfasst: Montag 1. Juni 2009, 12:18
von cofi
2 Stichworte: For-Schleife + `zip` (bzw `itertools.izip`)
Verfasst: Montag 1. Juni 2009, 12:20
von Hyperion
Alternativ wäre auch noch das diff-Modul einen Blick wert.
Verfasst: Montag 1. Juni 2009, 12:25
von wildflower
ok, vielen dank für die hilfe. werde mir das mal anschauen

Verfasst: Montag 1. Juni 2009, 12:29
von Dill
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...
Verfasst: Montag 1. Juni 2009, 12:38
von cofi
Mit (i)zip muss man sich aber nicht durch die Indices hangeln

Verfasst: Montag 1. Juni 2009, 13:15
von Dill
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...
Verfasst: Montag 1. Juni 2009, 13:26
von cofi
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)
Verfasst: Montag 1. Juni 2009, 13:29
von 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))
Verfasst: Montag 1. Juni 2009, 15:22
von Dill
hübsch...
ich weiss das ja eigentlich, schreibe aber irgendwie doch immer C-code
