从列表A中减去列表B,但保留列表A索引并使用difflib字符串相似性

时间:2015-05-04 15:53:14

标签: python string match subtraction difflib

我需要一些Python的帮助。这不是列表A中用于制作列表C的经典减去列表B.相反,我想查看列表A中的项目(单个词中的城市名称)中不在列表B中的索引,并将它们存储到另外,列表B中匹配的项目与列表A中的匹配项目不完全相同,它们来自OCR,因此它们拼写错误,如果它们相差90%,我想考虑匹配。< / p>

e.g。

列表A:#all列表项只是一个单词中的城市名

0. Corneria
1. klandasco
2. Blue_Mars
3. Setiro
4. Jeti_lo
5. Neo_Tokyo

列表B:#citynames很少拼错

0. lcandasco
1. Ne0_Tolcyo

所以,结果应该是......

列表C:

[0, 2, 3, 4]

结果项目并不重要(Corneria,Blue_Mars,Setiro,Jeti_lo),相反,我需要在减法完成后保留列表A中项目的原始索引。

到目前为止我这样做......

a = ["aaa", "bbb", "ccc", "ddd", "ccc", "eee"]
b = ["bbb", "eee"]
c = [i for i, v in enumerate(a) if v not in b]
print(c)

...输出

[0, 2, 3, 4]

但是我需要实现difflib部分才能匹配具有90%相似性的项目,我怎么能只使用纯python脚本来做(最好只使用difflib)???

1 个答案:

答案 0 :(得分:0)

这个怎么样:

from difflib import SequenceMatcher

max_ratio = 0.9

c = [i for i, v in enumerate(a) 
     if not any(map(lambda x: SequenceMatcher(None, v, x).ratio()>=max_ratio, b))]

使用fuzzywuzzy

的代码段
from fuzzywuzzy import fuzz

max_ratio = 90

c = [i for i, v in enumerate(a) 
     if not any(map(lambda x: fuzz.ratio(v, x)>=max_ratio, b))]

请注意。在使用fuzzywuzzy之前,您应该安装它。