4

我想比较 3 位或 4 位整数的字符串表示形式。我想将它们分组为成对的“亲密关系”。也就是说,pc_dud[3]应该与dud[0].

dud = ['3433', '3467', '3551', '345', '345', '3613'] 
pc_dud = ['3401', '3402', '3430', '0342', '3584']

有谁知道那里有一个很好的工具来做到这一点(我在想自己可能是像水母这样的东西)?当然,另一种解决方案是使用算术差异作为“接近度”的指标。有什么想法吗?

4

4 回答 4

2

您可以使用difflib模块:

例子:

>>> import difflib
>>> dud = ['3433', '3467', '3551', '345', '345', '3613'] 
>>> pc_dud = ['3401', '3402', '3430', '0342', '3584']
>>> difflib.get_close_matches(dud[0], pc_dud)
['3430']
于 2013-07-31T14:57:37.800 回答
1

如果您正在寻找算术上的接近性,那么 pc_dud[3] 将与 dud[0] 不匹配。

如果您只想保留唯一的对,请使用:

dud_ = dud[:]
pc_dud_ = pc_dud[:]

while dud_:
    d1, d2 = min(itertools.product(dud, pc_dud), key=lambda d1,d2: abs(int(d1) - int(d2)))
    dud_.remove(d1)
    pc_dud_.remove(d2)
    print d1, d2
于 2013-07-31T15:23:22.403 回答
0

您可以采用的一种方法是计算dud 中的每个整数字符串与 pc_dud 中的每个整数字符串之间的Levenshtein 距离。该算法将为您提供每个数字序列之间的编辑距离。编辑距离数字表示将给定序列转换为另一个序列所需的最小步数。它考虑了插入、删除和替换。

您还需要一个数据结构来存储相对于比较序列的编辑距离结果。然后,您可以调查哪个编辑距离最小,然后将它们组合为一对。

这是一个视觉示例,说明与 levenshtein 相比,您的数组中的两个数字序列会是什么样子。我使用这个工具来生成屏幕截图。http://www.let.rug.nl/kleiweg/lev/

http://imgur.com/OTJia7W

右下角的数字是最小编辑距离。

于 2013-07-31T15:02:37.660 回答
0

如果您按照 Paul 的建议走 Levenshtein Distance 路线,请查看 Apache 的PyLucene - 我相信 lucene 的 FuzzyQuery 就是基于此。

于 2013-07-31T15:14:09.417 回答