2015-09-25 58 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的绝对差异来查找最小值。** –