Kombinieren Sie Wörter mit dem nächsten Index

Ich habe eine Datei von Begriffen mit ihrem Index im Kontext in zwei Sprachen, wie dieses Format

1. (2- human rights, 10- workers rights)>> (3- droits de l'homme, 7- droit des travailleurs) 2. (2- human rights, 10- workers rights, 19- women rights)>> (5- droits de l'homme, 15- les droits des femmes) 

Das Ziel ist es, jedes Wort in der ersten Sprache (englisch) an das engste Wort im Satz in der anderen Sprache (Französisch) zu binden, also wird die Ausgabe sein

  human rights : droits de l'homme workers rights : droit des travailleurs human rights : droits de l'homme women rights : les droits des femmes 

Dies ist der Kommentar: Menschenrechte> droits de l'homme: seit dem n.2 (Position der "Menschenrechte" im englischen Satz) liegt nahe an n.3 (Position von "droits de l'homme" im französischen Satz) , Verglichen mit den anderen Zahlen in der französischen Liste (in diesem Fall n.7); Und in gleicher Weise "Arbeiterrechte"> "droit des travailleurs"

Menschenrechte> droits de l'homme: seit dem n.2 (Position der "Menschenrechte" im englischen Satz) liegt nahe an n.5 (Position "droits de l'homme" im französischen Satz), verglichen mit dem anderen Zahlen in der französischen Liste (in diesem Fall Nr. 15); Und in gleicher Weise "Frauenrechte"> "les droits des femmes": Da der n.19 nahe bei n.15 liegt (verglichen mit dem n.10)

Kann jemand gleich finden, um diese Ausgabe zu bekommen?

One Solution collect form web for “Kombinieren Sie Wörter mit dem nächsten Index”

Nicht abgeschlossen, aber du solltest dich anfangen:

 from bisect import bisect import re with open("test.txt") as f: r = re.compile("(\d+)") for line in f: a, b = line.lstrip("0123456789. ").split(">> ") a_keys = [int(i.group()) for i in r.finditer(a)] b_keys = [int(i.group()) for i in r.finditer(b)] a = a.strip("()\n").split(",") b = b.strip("()\n").split(",") for ele, s in zip(a, a_keys): ind = bisect(b_keys, s, hi=len(b) - 1) print("{} -> {}".format(ele, b[ind])) 

Ausgabe:

 2- human rights -> 3- droits de l'homme 10- workers rights -> 7- droit des travailleurs 2- human rights -> 5- droits de l'homme 10- workers rights -> 15- les droits des femmes 19- women rights -> 15- les droits des femmes 

Sie müssen die Formatierung reparieren und noch einen Scheck machen, um die Min auf der Grundlage der absoluten Differenz der ele bei ind und ind -1 zu finden.

Zu fangen, wo die absolute Abweichung des vorherigen ind-1 Elementes weniger ist:

 from bisect import bisect import re with open("test.txt") as f: r = re.compile("(\d+)") for line in f: a, b = line.lstrip("0123456789. ").split(">> ") a_keys = [int(i.group()) for i in r.finditer(a)] b_keys = [int(i.group()) for i in r.finditer(b)] a = a.strip("()\n").split(",") b = b.strip("()\n").split(",") for ele, k in zip(a, a_keys): ind = bisect(b_keys, k, hi=len(b) - 1) ind -= k - b_keys[ind] < b_keys[ind-1] - k print("{} -> {}".format(ele, b[ind])) 

So für:

 1. (2- human rights, 10- workers rights)>> (3- droits de l'homme, 7- droit des travailleurs) 2. (2- human rights, 10- workers rights, 19- women rights)>> (1- droits de l'homme ,4- foobar, 15- les droits des femmes) 

Wir bekommen:

 2- human rights -> 3- droits de l'homme 10- workers rights -> 7- droit des travailleurs 2- human rights -> 1- droits de l'homme 10- workers rights -> 15- les droits des femmes 19- women rights -> 15- les droits des femmes 

Der ursprüngliche Code würde 2- human rights -> 4- foobar ausgeben, da wir nicht berücksichtigt haben, wo die absolute Differenz des vorherigen Elements weniger ist.

Die Verwendung der Daten in Ihrem Kommentar zeigt den Unterschied:

 l1 = [10, 33, 50, 67] l2 = [7, 16, 29, 55] for s in l1: ind = bisect(l2, s, hi=len(l2) - 1) print("{} -> {}".format(s, l2[ind])) 

Ausgabe:

 10 -> 16 33 -> 55 50 -> 55 67 -> 55 

Jetzt mit der Überprüfung des vorherigen Elements:

 l1 = [10, 33, 50, 67] l2 = [7, 16, 29, 55] for s in l1: ind = bisect(l2, s, hi=len(l2) - 1) ind -= s - l2[ind-1] < l2[ind] - s print("{} -> {}".format(s, l2[ind])) 

Ausgabe:

 10 -> 7 33 -> 29 50 -> 55 67 -> 55 

Bisect.bisect

Ähnlich wie bei bisect_left (), gibt aber einen Einfügepunkt zurück, der nach (rechts von) vorhandenen Einträgen von x in a kommt. Der zurückgesetzte Einfügepunkt i trennt das Array a in zwei Hälften, so dass alle (val <= x für val in a [lo: i]) für die linke Seite und alle (val> x für val in a [i: hi]) Für die rechte seite

So bisecting bekommt, wo das Element sollte in Ihrer geordneten Liste der Zahlen mit allen Elementen weniger als auf der linken Seite des Elements, so dass das Element ist größer als alle vorherigen. Um das nächste zu finden, das auf dem Unterschied basiert, müssen wir das vorherige Element überprüfen, da der abs-Unterschied weniger sein kann.

  • Was ist der Unterschied zwischen Pip installieren und python -m Pip installieren?
  • Except-clause löscht die lokale Variable
  • Rufen Sie das Programm mit Argumenten an
  • Warum macht setup.py den Inhalt des Namespaces vor der Installation?
  • Warum braucht eine meiner Variablen keine Deklaration, während die andere nicht funktioniert?
  • Redefined äußerer Name vom äußeren Bereich Python3
  • Unterstützt CMake Python3?
  • Python mehrzeilig mit Aussage
  • Wo ist das Python-Start-Banner definiert?
  • Maskierung der eingebauten Variable mit ihrem magischen Verhalten?
  • Selen Python Firefox Webdriver: Profil kann nicht geändert werden
  • Python ist die beste Programmiersprache der Welt.