2012-07-11 77 views
0

我有两个列表,下面,我想比较如果单词levenshtein距离小于2.我有一个函数来找到levenshtein距离,但作为它需要的参数这两个字。我可以找到哪些单词不在另一个列表中,但它没有帮助。我可以通过指数去指数,但如下面的情况下,当我到达指数7(但除了除外),所有事情都被抛弃了,因为不忠将是指数9和8,而wcop88是9和10,因此这些不会被比较。有什么方法可以说,如果不忠的一部分在另一个列表中的某个词中,然后检查这两个,请注意这并不总是奏效,因为如果说不忠和感染只有in和ty可以匹配,许多单词可以可能匹配levenshtein与python列表中的项目的距离

[u'rt', u'cuaimatizada', u's', u'cuaimaqueserespeta', u'forgives', u'any', u'mistake', u'but', u'the', u'infidelity', u'wocp88'] 
[u'rt', u'cuiamatizada', u's', u'cuimaqueserespeta', u'forgive', u'any', u'mistake', u'except', u'infedelity', u'wcop88'] 

编辑:所以我的目标是能够养活我的莱文斯坦功能这两个词需要进行检查。在这种情况下,以下配对:

u'cuaimatizada  u'cuiamatizada 

u'cuaimaqueserespeta u'cuimaqueserespeta 

u'forgives u'forgive 

u'infedelity u'infidelity 

u'wocp88 u'wcop88 

我不知道前面哪个单词。

+2

?你的目标是什么? – 2012-07-11 16:28:12

+0

林不知道你想要么...你在找'zip(list1,list2)'? – 2012-07-11 16:31:49

+0

我编辑了我的目标 – jacobLoz 2012-07-11 16:33:35

回答

2

我想这是你想要的......但你能澄清这个问题有点比较所有的话......不只是匹配索引

wordpairs = [(w1,w2) for w1 in list1 for w2 in list2 if levenstein(w1,w2) < 2] 

>>> matches = [(w1,w2) for w1 in l12 for w2 in l22 if levenshtein(w1,w2) < 2] 

[(u'rt', u'rt'), (u's', u's'), (u'cuaimaqueserespeta', u'cuimaqueserespeta'), (u'forgives', u'forgive'), (u'any', u'any'), (u'mistake', u'mistake'), (u'infidelity',u'infedelity')] 
+1

或...'过滤器(lambda i:levenshtein(* i),itertools.product(list1,list2))' – 2012-07-11 16:48:03

+1

这可能更快,所以+1 ...虽然我认为列表理解适度更易读 – 2012-07-11 16:53:39

+1

我'只要提到你可以通过定义'is_levenstein_less_than_2(x,y)'来提高这个算法的速度。你需要这样做,因为你可以通过沿着主对角线执行DP来实现'O(min(| x |,| y |))'。 – JPvdMerwe 2012-07-11 17:04:19