比较两个字符串或列表,你可以使用Levenshtein distance(从here Python实现):
def levenshtein(s1, s2):
l1 = len(s1)
l2 = len(s2)
matrix = [range(l1 + 1)] * (l2 + 1)
for zz in range(l2 + 1):
matrix[zz] = range(zz,zz + l1 + 1)
for zz in range(0,l2):
for sz in range(0,l1):
if s1[sz] == s2[zz]:
matrix[zz+1][sz+1] = min(matrix[zz+1][sz] + 1,
matrix[zz][sz+1] + 1,
matrix[zz][sz])
else:
matrix[zz+1][sz+1] = min(matrix[zz+1][sz] + 1,
matrix[zz][sz+1] + 1,
matrix[zz][sz] + 1)
return matrix[l2][l1]
使用您的列表:
>>> a = [4, 7, 9]
>>> b = [5, 8, 10]
>>> c = [2, 3]
>>> levenshtein(a,b)
3
>>> levenshtein(b,c)
3
>>> levenshtein(a,c)
3
编辑:与添加的解释在评论中,您可以使用set
而不是列表。由于集合中的每个元素都是唯一的,因此再次添加现有元素是无操作的。你可以使用这个集合的isdisjoint
方法检查两个集不包含相同的元素,或intersection
方法,看看他们有哪些元素是共同的:
In [1]: a = {1,3,5}
In [2]: a.add(3)
In [3]: a
Out[3]: set([1, 3, 5])
In [4]: a.add(4)
In [5]: a
Out[5]: set([1, 3, 4, 5])
In [6]: b = {2,3,7}
In [7]: a.isdisjoint(b)
Out[7]: False
In [8]: a.intersection(b)
Out[8]: set([3])
注:此语法创建组至少需要Python 2.7。
谢谢罗兰!虽然代码可能没有直接用处,但是感谢大家向我介绍Levenshtein距离的想法。 – RLOA 2012-08-15 11:15:59