Hallo.
Gibt es in Python irgendeine Funktion mit der man vergleichen kann, wieviele Buchstaben in 2 Strings übereinstimmen und das in Prozent ausgeben?
Ich stell mir das so vor, wie bei der PHP Funktion similar_text
Python Funktion um Strings zu vergleichen
Dazu müsste man wissen was die PHP-Funktion macht.
Zwei Ansätze die mir einfallen würden wären der `difflib.SequenceMatcher` oder selber etwas schreiben.
Wie sich das Verhältnis genau berechnet bitte in der Dokumentation nachlesen.
Selbstgebastelt:
Die Funktion hält sich im wesentlichen an Deine Beschreibung indem sie das Verhältnis von übereinstimmenden Elementen zur Gesamtanzahl berechnet. Nichtvorhandene Elemente, also wenn die Sequenzen unterschiedlich lang sind, zählen als Unterschiede.
Zwei Ansätze die mir einfallen würden wären der `difflib.SequenceMatcher` oder selber etwas schreiben.
Code: Alles auswählen
from difflib import SequenceMatcher
def get_similarity_ratio(seq_a, seq_b):
return SequenceMatcher(a=seq_a, b=seq_b).ratio()
Selbstgebastelt:
Code: Alles auswählen
from __future__ import division
from itertools import izip
def get_similarity_ratio(seq_a, seq_b):
total = max(map(len, (seq_a, seq_b)))
if total == 0:
return 1
matches = sum(int(a == b) for a, b in izip(seq_a, seq_b))
return matches / total
Hi. Erstmal: vielen Dank für deine kompetente Hilfe.
Da ich leider grad nicht die Möglichkeit hab es auszuprobieren, hab ich noch folgende Frage: Gibt deine Funktion/die andere es in einer Prozentzahl aus? Das ist nämlich für mich Vorraussetzung.
Vielen Dank
Da ich leider grad nicht die Möglichkeit hab es auszuprobieren, hab ich noch folgende Frage: Gibt deine Funktion/die andere es in einer Prozentzahl aus? Das ist nämlich für mich Vorraussetzung.
Vielen Dank
Hallo. Vielen Dank für eure Ergebnise. Hab jetzt doch noch kurz Zeit gefunden es zu testen.
Das ist einfach die perfekte Lösung.
Ich musste nur noch ein *100 dahinter machen, und schon hab ich die Prozentzahl. Vielen Vielen Dank. Ihr habt mir riesig geholfen.
Code: Alles auswählen
from difflib import SequenceMatcher
def get_similarity_ratio(seq_a, seq_b):
return SequenceMatcher(a=seq_a, b=seq_b).ratio()
Ich musste nur noch ein *100 dahinter machen, und schon hab ich die Prozentzahl. Vielen Vielen Dank. Ihr habt mir riesig geholfen.
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Das ergibt allerdings immer 0%, da die Division zweier Integer auf einen Integer abrundet.R00TKiD hat geschrieben: return str(matches / total * 100) + "%"
Abhilfe schafft
(a) Konvertieren von (mind.) einem Operanden in float oder
(b) from __future__ import division
Hi, ich bin es nochmal. Ich habe jetzt seltsamerweise das Problem dass wenn ich die Strings vertausche, es unterschiedliche Ergebnise gibt. Woran könnte es liegen? Es ist mir nämlich wichtig dass die Reihenfolge irrelevant ist.
Das wird wohl an dem Algorithmus vom `SequenceMatcher` liegen. Meine kleine Funktion da oben sollte das Problem nicht haben. Oder Du sortierst die beiden Zeichenketten, so dass sie immer in der gleichen Reihenfolge an den `SequenceMatcher` übergeben werden.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Einfach nur beide Strings sortieren?sprudel hat geschrieben:Wie muss ich die denn sortieren?
Code: Alles auswählen
string = 'Das ist ein String'
string_sortiert = ''.join(sorted(string))
Das erste ist nur ein Pseudo-Import den du weglassen kannst wenn du den Code umschreibst und das zweite ein Import aus der Stdlib, dessen Dauer überhaupt schwer zu messen sein wird.sprudel hat geschrieben:Bei deiner Funktion muss ich leeider so viel importieren. Deswegen will ich mir die nur als letzte Möglichkeit aufheben
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Hi. Gibt es auch eine Möglichkeit es so zu machen dass die Einträge in einer Liste (Dictionary oder was auch immer... ich kann diese Dinger vom Namen her immer noch nicht unterscheiden) ausgegeben werden? Also beide in einem, aber alphabetisch geordnet. So wäre ein vertauschen nicht schlimm, da sie sowieso sortiert werden.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Dictionary ist aber radikal unterschiedlich von einer Liste. Schon allein dadurch dass ein Dictionary von Definition aus unsortiert ist.sprudel hat geschrieben:Hi. Gibt es auch eine Möglichkeit es so zu machen dass die Einträge in einer Liste (Dictionary oder was auch immer... ich kann diese Dinger vom Namen her immer noch nicht unterscheiden) ausgegeben werden?
Ganz ehrlich - ich verstehe irgendwie nicht auf was du hinaus willst.sprudel hat geschrieben:Also beide in einem, aber alphabetisch geordnet. So wäre ein vertauschen nicht schlimm, da sie sowieso sortiert werden.
Code: Alles auswählen
string_dict = {'string1' : 'Vergleich1', 'string2' : 'Vergleich2'}
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ich versuche es nochmal vom Anfang an zu erklären.
Ich möchte für meinen kleinen Bruder einen sogenannten Love-O-Meter machen, wie ihn Jamba auch anbietet. Dort kann man zwei Namen eingeben und dann wird angezeigt wie sehr sie zusammenpassen.
Es ist nur leider im Moment so dass wenn man die Namen vertauscht, ein anderes Ergebnis herauskommt. Deswegen dachte ich mir ich ordne die Ergebnisse alphabetisch. So wäre ein vertauschen nicht schlimm. Die Frage ist nur: wie mache ich das?
Ich möchte für meinen kleinen Bruder einen sogenannten Love-O-Meter machen, wie ihn Jamba auch anbietet. Dort kann man zwei Namen eingeben und dann wird angezeigt wie sehr sie zusammenpassen.
Es ist nur leider im Moment so dass wenn man die Namen vertauscht, ein anderes Ergebnis herauskommt. Deswegen dachte ich mir ich ordne die Ergebnisse alphabetisch. So wäre ein vertauschen nicht schlimm. Die Frage ist nur: wie mache ich das?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Achso, jetzt ist klar.sprudel hat geschrieben:So wäre ein vertauschen nicht schlimm. Die Frage ist nur: wie mache ich das?
Das geht etwa so:
Code: Alles auswählen
In [45]: namen = ['Lukas', 'Anna']
In [46]: namen.sort()
In [47]: namen
Out[47]: ['Anna', 'Lukas']
Code: Alles auswählen
In [49]: from difflib import SequenceMatcher
In [51]: def get_similarity_percent(seq_a, seq_b):
return SequenceMatcher(a=seq_a, b=seq_b).ratio() * 100
In [56]: get_similarity_percent(*namen)
Out[56]: 22.222222222222221
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice