2015-09-25 110 views
1

我與他們在上下文中的兩種語言索引項的文件最近的指數,因爲這種格式組合單詞,

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) 

的目標是每一個字的第一語言(英語)連接到最近的詞在其他語言(法語)這句話,所以輸出將

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

這是評論:人權> droits DE L'HOMME:自N.2(「人權」的位置在英語句子中)接近於n.3(法語句子中的「droits de l'homme」的位置),與其他數字相比較presen t在法國名單中(在這種情況下是n.7);並以同樣的方式「工人權利」>「droit des travailleurs」

人權> droits de l'homme:自n.2(英文句子中「人權」的位置)接近n.5 (在法語句子中的「droits de l'homme」的位置),與法國名單中存在的其他數字相比(在本例中爲n.15);並以同樣的方式「女性權利」>「男性權利」:由於n.19接近n.15(與n.10相比)

有人可以找到相同的方式來獲得此輸出嗎?

+1

你可以揭露你到目前爲止所嘗試過的嗎? – Cyrbil

+0

請在最後2段中格式化您的代碼片段。 –

回答

2

沒有完成,但應該讓你開始:

from bisect import bisect 
import re 

with open("test.txt") as f: 
    r = re.compile("(\d+)") 
    for line in f: 
     a, b = line.lstrip(". ").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])) 

輸出:

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 

你需要修復的格式和做一個檢查基礎上的絕對差值找到分鐘ind和ind的電子元件-1。

要趕在前面的IND-1元的絕對型差分少:

from bisect import bisect 
import re 

with open("test.txt") as f: 
    r = re.compile("(\d+)") 
    for line in f: 
     a, b = line.lstrip(". ").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])) 

所以對:

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) 

我們得到:

​​

原代碼會輸出2- human rights -> 4- foobar,因爲我們沒有考慮前一個元素的絕對差異在哪裏較少。

使用您的評論的數據顯示差異:

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])) 

輸出:

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

現在與檢查前一個元素:

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])) 

輸出:

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

bisect.bisect

)類似於bisect_left(,但返回其自帶後(到右側)是一個x的任何現有條目的插入點。 返回的插入點i將數組a分成兩半,以便左側的所有(val < = x for [lo:i]中的val)和all [val> x for val [a:hi] )爲右側。

因此,平分得到的元素應該在您的有序數字列表中的位置,所有元素都位於元素左側,這意味着元素大於以前的所有元素。爲了找到最接近的差異,我們需要檢查前一個元素,因爲絕對差異可能會更小。

+0

忘記您使用python3 –

+0

有一些邊緣情況下要趕上。現在有值班電話,但我會在稍後回到我的回答並解釋時編輯。 –

+0

@ user3573552,*您需要修復格式* **,然後再執行一次檢查,以根據ind和ind -1處ele的絕對差異來查找最小值。** –