将列表与列表进行比较,以获得与我们正在比较的列表最匹配的列表

时间:2015-10-31 16:06:47

标签: python list compare

我有一个列表a = ["c","o","m","p","a","r","e"]。我有两个清单

b = ["c","l","o","m","p","a","r","e"]c=["c","o","m","p","a","e","r"]

现在我想将列表'b'和'c'与'a'进行比较,以查看'b'元素的顺序是否更接近'a'或'c'元素的顺序是否更接近并返回列表。我想要实现的是将'b'和'c'与'a'进行比较时返回列表'b'。有没有这样做的功能?

2 个答案:

答案 0 :(得分:3)

解决此问题的传统方法是使用Levenshtein distance。这基本上统计了从一个字符串移动到另一个字符串所需的所有添加,删除和插入。

您可以将每个操作视为“打破”static_assert的模式。

这是一个非常简单的实现功能,但有一个包已经为你完成了here。示例代码如下:

a

答案 1 :(得分:3)

difflib.SequenceMatcher会找到

  

最长的连续匹配子序列   不包含"垃圾"元素

SequenceMatcher.ratio返回序列的度量'相似。它是 [0,1] 范围内的浮点数。较高的比率表示较高的相似性(如果给定的序列相同,则比率为1)。

下面的辅助函数使用max函数将第一个参数与其余位置参数进行比较:

def closest(seq, *args):
    # Cache information about `seq`.
    # We only really need to change one sequence.
    sm = SequenceMatcher(b=seq)
    def _ratio(x):
        sm.set_seq1(x)
        return sm.ratio()
    return max(args, key=_ratio)

示例:

In [37]: closest(
   ....:     ['c', 'o', 'm', 'p', 'a', 'r', 'e'], # a
   ....:     ['c', 'l', 'o', 'm', 'p', 'a', 'r', 'e'], # b
   ....:     ['c', 'o', 'm', 'p', 'a', 'e', 'r'] # c
   ....: )
Out[37]: ['c', 'l', 'o', 'm', 'p', 'a', 'r', 'e'] # b