我有一个列表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'。有没有这样做的功能?
答案 0 :(得分:3)
解决此问题的传统方法是使用Levenshtein distance。这基本上统计了从一个字符串移动到另一个字符串所需的所有添加,删除和插入。
您可以将每个操作视为“打破”static_assert
的模式。
这是一个非常简单的实现功能,但有一个包已经为你完成了here。示例代码如下:
a
答案 1 :(得分:3)
最长的连续匹配子序列 不包含"垃圾"元素
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