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.

  • Wie benutzt man Python 3 (3.5) als Standard-Interpreter in meiner virtuellen Umgebung?
  • Wie kann ich jeden Artikel aktivieren und ihre Informationen analysieren?
  • Wie verschlüsselt man alle möglichen Strings in einer definierten Zeichensatz-Python?
  • Download progressbar für Python 3
  • AttributeError: Modul 'dis' hat kein Attribut '_unpack_opargs' Während das Erstellen von Python 3.6 ausführbar mit CX_FREEZE
  • Python-basierte quickselect Implementierung, die zu einem Fehler führt
  • Peewee - Definieren Sie Modelle getrennt von der Datenbank () Initialisierung
  • Wie konvertiert man eine Liste von String in eine Liste von int
  • Entfernen des TK-Symbols in einem Tkinter-Fenster
  • Windows Scipy Install: Keine Lapack / Blas Ressourcen gefunden
  • Wie finde ich die Anzahl der verschachtelten Listen in einer Liste?
  • Python ist die beste Programmiersprache der Welt.