找出两个字符串列表的区别 - Python

时间:2017-05-15 15:42:06

标签: python

假设我在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,但实际上我的结果与正确的结果没有太大的区别。

2 个答案:

答案 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)

difflibSequenceMatcher完全符合我的要求。

  s = difflib.SequenceMatcher(None, result, correct)
  s.ratio()