【问题标题】:compare lists with a list to get the list which is closest match to the list we are comparing将列表与列表进行比较以获取与我们正在比较的列表最匹配的列表
【发布时间】:2015-10-31 16:06:47
【问题描述】:

我有一个列表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”。有这样的功能吗?

【问题讨论】:

  • 你如何定义closer
  • @AhsanulHaque 它的元素模式。我想检查 a 元素的模式是否在 b 中重复。即使它的部分匹配只表示前 3 个元素的模式就足够了。

标签: python list compare


【解决方案1】:

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

【讨论】:

  • 如果两个列表在比较这两个列表时得到相似的比率怎么办
  • @Harwee 然后max 函数将返回第一个列表。
【解决方案2】:

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

您可以将这些操作中的每一个都视为“打破”a 的模式。

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

>>> from Levenshtein import distance
>>> distance("compare", "clompare")
1
>>> distance("compare", "compaer")
2

【讨论】:

  • 这看起来不错,我会试试看它是否适合我
  • @Harwee 很高兴听到这个消息!如果不是,看起来vaultah 的解决方案也适用于不同的相似性定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多