Python - Itertools Liste vergleichen?
Hallo,
ich habe aus einer Textdatei jede einzelne Zeile mit Hilfe von Itertools
a = combinations(zeilen, 2)
alle Möglichen Kombinationen in Zweiergruppen gepackt. Diese möchte ich nun mit Hilfe von fuzzywuzzy untereinander vergleichen. Das Problem ist, bei der Art vergleich werden zwei Angaben benötigt.
ratio = fuzz.ratio(zeile1, zeile2)
Meine Gruppe a habe ich aber ja nur einmal? Also klappt das folgende nicht
ratio = fuzz.ratio(a)
Wie genau kann ich dieses Problem lösen?
1 Antwort
a generiert Dir im Endeffekt nacheinander die Kombinationen.
for comb in combinations(zeilen,2):
fuzz.ratio(comb[0],comb[1])
Die Kombinationen werden als Tupel der Länge 2 generiert.
Ich kenne natürlich den Gesamtkontext nicht Du könntest ja einfach direkt ein IF in dem Beispiel oben einbauen.
Vielleicht könntest Du auch sowas machen:
(print (comb[0]) if fuzz.ratio(comb[0],comb[1])>50 else print(comb[0],comb[1]) for comb in itertools.combinations(zeilen,2))
Das wäre jetzt als Generatorausdruck.
Oder eben:
for comb in itetools.combinations(zeilen,2):
print(comb[0]) if fuzz.ratio(*comb)>50 else print(comb[0],comb[1])
*comb ist dabei ein Unpackign des Tuples, anstatt einer expliziten Inidzierung.
Es gibt sicher noch mehr Wege ;-).
Du hast mir bei der ganzen Sache wirklich unglaublich geholfen. Vielen vielen Dank!!
Hallo nochmal, habe jetzt mal so einiges probiert und es klappt auch wirklich super. Allerdings würde ich gerne eine solche Abfrage mit dem Vergleich meiner Liste einbauen, sodass alle Kombinationen mit einem ratio score über 50 in einer Gruppe gesammelt werden.
Jetzt aktuell gebe ich ja nur eine Zeile aus, wenn der score über 50 liegt, ansonsten beide.
Im Idealfall möchte ich aber gerne am Ende alle ähnlichen Nachrichten (ratio>50) in Gruppen ausgeben bzw. das man sich jede Zeile nimmt, alle andere damit vergleicht und wenn der Score über 50 ist in eine Gruppe gepackt wird, die dann ausgegeben werden kann.
Hättest du da zufällig auch einen Weg für? :D
Du könntest Dir eine Teilliste bauen, indem Du eien Listcomprehension nutzt
result=[comb for comb in combinations(...) if <cond>]
Als Bedingung gibst Du eben Dein Kriterium an und erhälst so eine gefilterte Liste aus Tupeln.
Vielen Dank schonmal das hilft mir sehr. Kannst Du mir zufällig noch sagen, wie die Ausgabe anschließend aussehen könnte?
Mein Ziel wäre es, wenn die Strings einen ratio score unter bsp. 50 -> beide ausgeben und ratio score über 50 -> nur einen von beiden ausgeben, da diese ja sehr wahrscheinlich gleich sind.
Geht das irgendwie so in der Richtung?