我一直在尝试使用 SequenceMatcher 创建嵌套或递归效果。
最终目标是比较两个序列,它们都可能包含不同类型的实例。
例如,序列可以是:
l1 = [1, "Foo", "Bar", 3]
l2 = [1, "Fo", "Bak", 2]
通常,SequenceMatcher 只会将 [1] 识别为 l1 和 l2 的公共子序列。
我希望 SequnceMatcher 对 string instances 应用两次,以便"Foo"
and 和 and"Fo"
被认为是相等的,"Bar"
并且"Bak"
最长的公共子序列的长度为 3 [1, Foo/Fo, Bar/Bak]
。也就是说,我希望 SequenceMatcher在比较 string members 时更加宽容。
我尝试做的是为内置 str 类编写一个包装器:
from difflib import SequenceMatcher
class myString:
def __init__(self, string):
self.string = string
def __hash__(self):
return hash(self.string)
def __eq__(self, other):
return SequenceMatcher(a=self.string, b=self.string).ratio() > 0.5
编辑:也许更优雅的方式是:
class myString(str):
def __eq__(self, other):
return SequenceMatcher(a=self, b=other).ratio() > 0.5
通过这样做,以下是可能的:
>>> Foo = myString("Foo")
>>> Fo = myString("Fo")
>>> Bar = myString("Bar")
>>> Bak = myString("Bak")
>>> l1 = [1, Foo, Bar, 3]
>>> l2 = [1, Fo, Bak, 2]
>>> SequenceMatcher(a=l1, b=l2).ratio()
0.75
所以,显然它正在工作,但我对覆盖散列函数有一种不好的感觉。什么时候使用哈希?它还能从哪里回来咬我?
SequenceMatcher 的文档说明如下:
这是一个灵活的类,用于比较任何类型的序列对,只要序列元素是可散列的。
根据定义,可散列元素需要满足以下要求:
比较相等的可散列对象必须具有相同的散列值。
另外,我还需要覆盖cmp吗?
我很想听听我想到的其他解决方案。
谢谢。