假设我在Python中有两个字符串列表(但这个问题并不是特定于语言的):
a = ["cat", "dog", "fish"]
b = ["cat", "dog", "fish"]
我的目标是能够量化这两个列表的差异。更具体地说,我的程序必须计算"类似的"是列表1到列表2并给它一个"得分"。我用它来计算我得到的一些结果中的错误。我处理一些音频,我得到一个结果列表。我想将结果与我应该得到的结果进行比较。
因此,在上面的例子中,结果与正确的结果相同,所以答案应为1(100%)。
在这种情况下:
a = ["cat", "dog", "fish", "lion"]
b = ["cat", "dog", "fish", "tiger"]
结果是0.75(75%)。
这是我的代码:
def compare_lists(result, correct):
# TODO: This could be way better.
if len(result) != len(correct):
return 0
else:
sum = 0
for i in range(0, len(result)):
if result[i] == correct[i]:
sum += 1
return float(sum) / float(len(result))
但是,当列表具有不同的长度时会出现问题。例如:
a = ["cat", "dog", "zebra", "fish"]
b = ["dog", "zebra", "fish"]
此处描述的逻辑不能在此处应用。在这种情况下,b
几乎与a
相同,但a
在开头有一个元素。我希望能够正确地量化这个"相似性",因为我当前的算法返回0,但实际上我的结果与正确的结果没有太大的区别。
答案 0 :(得分:1)
您可以尝试此算法:
a = ["cat", "dog", "dog", "fish"]
b = ["dog", "dog", "fish"]
if len(a) != len(b):
results = ''.join(a).split(''.join(b))
results = [i for i in results if i != '']
print results
print len(results)
print((len(a)-len(results))/float(len(a)))
else:
off_by = (len(b)-len([1 for i in range(len(b)) if b[i] != a[i]]))/float(len(a))
print(off_by)
此算法的目标是确定一个列表与另一个列表的差异程度。在此示例中,算法注意到列表b存在于a中,但前面有另一个元素。因此,列表a与列表b的不同之处在于。因此,我们可以说得分应该是0.75,因为列表a中的四个元素中的三个属于列表b,或者3/4
答案 1 :(得分:-1)
difflib的SequenceMatcher
完全符合我的要求。
s = difflib.SequenceMatcher(None, result, correct)
s.ratio()